1) Problem
I would like to set 2 listeners on 2 buttons inside a CardView. I need to know which item has been selected. I use CardView with RecyclerView and FirebaseRecyclerAdapter (RecyclerView.Adapter)
2) Old Situation
I have created the listener in populateViewHolder() of my FirebaseRecyclerAdapter like this:
@Override
protected void populateViewHolder(final ItemViewHolder viewHolder, final Item model, final int position) {
viewHolder.firstButton.setOnClickListener(new View.OnClickListener() {
Item selectedItem = getItem(position);
//do something for the item selected
}
}
this works fine!
3) What I would like to do
Set listeners in the ViewHolder class (defined in his own file) and do something on the selected ITEM
I would like to set the listeners in the ViewHolder class because the same ViewHolder is used for different adapters and I think it's a better approach to have the behaviour of the listeners defined in only one place.
I did like this:
public class ItemViewHolder extends RecyclerView.ViewHolder {
public CardView cardView;
public TextView itemText;
public ImageView itemFirstButton;
public ImageView itemSecondButton;
public ItemViewHolder(View itemView) {
super(itemView);
cardView = (CardView)itemView.findViewById(R.id.item_card_view);
itemText = (TextView)itemView.findViewById(R.id.item_text);
itemFirstButton = (ImageView)itemView.findViewById(R.id.ic_first_action);
itemSecondButton = (ImageView)itemView.findViewById(R.id.ic_second_action);
itemFirstButton.setOnClickListener(firstListener);
itemSecondButton.setOnClickListener(secondListener);
}
private View.OnClickListener firstLinstener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
}
};
private View.OnClickListener secondListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
}
};
}
Inside the listener I can't get any reference on the item, just the position...
I have the impression I have to declare an interface for the listener and pass to the adapter, but I don't know how.
Does it make still sense to declare the listeners in the viewholder or I keep them in the adapter as the old solution?