2016-06-02 22 views
0

Ich habe eine Recyclerview mit 2 Arten von Viewholders für 2 Arten von Elementen Ich möchte auf Klick Listener auf Sub-Elemente in den Elementen implementieren bestehenden Lösungen zeigt Viewholder Klasse sollte innerhalb des Adapters als statisch implementiert werden, aber ich habe sie in sepearte Datei deklariert (ein Tutorial vorgeschlagen), so kann ich nicht implementieren onlick Zuhörer auf den viewholders meine viewholder1 Klasse istwie auf Klick Listener von Recyclerview wo Listenelemente sind heterogen gesetzt

public class ViewHolder1 extends RecyclerView.ViewHolder { 

    private TextView label1, label2; 
    public ImageView postImage; 

    public ViewHolder1(View v) { 
     super(v); 
     label1 = (TextView) v.findViewById(R.id.text11); 
     label2 = (TextView) v.findViewById(R.id.text22); 
     postImage = (ImageView) v.findViewById(R.id.dummyImage); 
    } 


    public TextView getLabel1() { 
     return label1; 
    } 

    public void setLabel1(TextView label1) { 
     this.label1 = label1; 
    } 

    public TextView getLabel2() { 
     return label2; 
    } 

    public void setLabel2(TextView label2) { 
     this.label2 = label2; 
    } 
} 

viewholder2 ist

public class ViewHolder2 extends RecyclerView.ViewHolder { 

    private ImageView ivExample; 

    public ViewHolder2(View v) { 
     super(v); 
     ivExample = (ImageView) v.findViewById(R.id.ivExample); 
    } 

    public ImageView getImageView() { 
     return ivExample; 
    } 

    public void setImageView(ImageView ivExample) { 
     this.ivExample = ivExample; 
    } 
} 

Adapter ist

public class ComplexRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 





    // The items to display in your RecyclerView 
    private List<Object> items; 

    private final int USER = 0, IMAGE = 1; 

    // Provide a suitable constructor (depends on the kind of dataset) 
    public ComplexRecyclerViewAdapter(List<Object> items) { 
     this.items = items; 
    } 

    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return this.items.size(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if (items.get(position) instanceof User) { 
      return USER; 
     } else if (items.get(position) instanceof String) { 
      return IMAGE; 
     } 
     return -1; 
    } 



    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
     RecyclerView.ViewHolder viewHolder; 
     LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); 

     switch (viewType) { 
      case USER: 
       View v1 = inflater.inflate(R.layout.layout_viewholder1, viewGroup, false); 
       viewHolder = new ViewHolder1(v1); 
       break; 
      case IMAGE: 
       View v2 = inflater.inflate(R.layout.layout_viewholder2, viewGroup, false); 
       viewHolder = new ViewHolder2(v2); 
       break; 
      default: 
       View v3 = inflater.inflate(R.layout.layout_viewholder2, viewGroup, false); 
       viewHolder = new ViewHolder2(v3); 
       break; 
     } 
     return viewHolder; 
    } 


    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) { 
     switch (viewHolder.getItemViewType()) { 
      case USER: 
       ViewHolder1 vh1 = (ViewHolder1) viewHolder; 
       configureViewHolder1(vh1, position); 
       break; 
      case IMAGE: 
       ViewHolder2 vh2 = (ViewHolder2) viewHolder; 
       configureViewHolder2(vh2); 
       break; 
      default: 
       ViewHolder2 vh3 = (ViewHolder2) viewHolder; 
       configureViewHolder2(vh3); 
       break; 
     } 

    } 
// private void configureDefaultViewHolder(RecyclerViewSimpleTextViewHolder vh, int position) { 
//  vh.getLabel().setText((CharSequence) items.get(position)); 
// } 
    private void configureViewHolder1(ViewHolder1 vh1, int position) { 
     User user = (User) items.get(position); 
     if (user != null) { 
      vh1.getLabel1().setText(user.getMFName()); 
      vh1.getLabel2().setText(user.getMName()); 
      //vh1.postImage.setImageResource(R.drawable.universe); 
      Picasso.with(vh1.postImage.getContext()) 
        .load(R.drawable.universe) 
        .resize(400,200) // resizes the image to these dimensions (in pixel) 
        .centerCrop() 
        .placeholder(R.drawable.progress_animation) 
        .error(R.drawable.error_image) 
        .into(vh1.postImage); 
     } 
    } 
    private void configureViewHolder2(ViewHolder2 vh2) { 
     // vh2.getImageView().setImageResource(R.drawable.sample_golden_gate); 
     Picasso.with(vh2.getImageView().getContext()) 
       .load(R.drawable.sample_golden_gate) 
       .resize(400,200) // resizes the image to these dimensions (in pixel) 
       .centerCrop() 
       .placeholder(R.drawable.progress_animation) 
       .error(R.drawable.error_image) 
       .into(vh2.getImageView()); 
    } 

} 

Fragment, das alle

public class OneFragment extends Fragment { 

    private static final int VERTICAL_ITEM_SPACE = 48; 

    Button button; 
    RecyclerView rvMixed; 
    public OneFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     // Inflate the layout for this fragment 
     View rootView = inflater.inflate(R.layout.fragment_one, container, false); 
     // Lookup the recyclerview in activity layout 
     rvMixed = (RecyclerView) rootView.findViewById(R.id.rvContacts); 
     rvMixed.setAdapter(new ComplexRecyclerViewAdapter(getSampleArrayList())); 

     LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext()); 
// Control orientation of the items 
// also supports LinearLayoutManager.HORIZONTAL 
     layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
// Optionally customize the position you want to default scroll to 
     layoutManager.scrollToPosition(0); 
// Attach layout manager to the RecyclerView 
     rvMixed.setLayoutManager(layoutManager); 

     //adding spacing between recycler view items 
     // rvMixed.addItemDecoration(new VerticalSpaceItemDecoration(VERTICAL_ITEM_SPACE)); 




     // That's all! 

     return rootView; 

    } 
    private void bindDataToAdapter() { 
     // Bind adapter to recycler view object 
     rvMixed = (RecyclerView) getView().findViewById(R.id.rvContacts); 
     ComplexRecyclerViewAdapter mAdapter = new ComplexRecyclerViewAdapter(getSampleArrayList()); 
     rvMixed.setAdapter(mAdapter); 

    } 
    private ArrayList<Object> getSampleArrayList() { 
     ArrayList<Object> items = new ArrayList<>(); 
     items.add(new User("Dany Targaryen", "Valyria")); 
     items.add(new User("Rob Stark", "Winterfell")); 
     items.add("image"); 
     items.add(new User("Jon Snow", "Castle Black")); 
     items.add("image"); 
     items.add(new User("Tyrion Lanister", "King's Landing")); 
     return items; 
    } 

} 

Antwort

0

verwendet man einfach den Klick-Listener auf ComplexRecyclerViewAdapter durch den Konstruktor zum Zeitpunkt seiner Initialisierung übergeben. Und dann können Sie die gleiche Klick-Listener-Referenz für jeden ViewHolder wiederverwenden.