1)问题的onClick内ViewHolder没有获得点击的项目适配器
我想设置一个CardView内的2个按钮2个监听器。我需要知道哪个项目已被选中。我用CardView与RecyclerView和FirebaseRecyclerAdapter我FirebaseRecyclerAdapter的(RecyclerView.Adapter)
2)老样子
我在populateViewHolder创建的监听器()这样的:
@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
}
}
这工作正常!
3)我想这样做
集听众在ViewHolder类(在自己的文件中定义),并做一些对所选项目
我想设置ViewHolder类中的监听器,因为相同的ViewHolder用于不同的适配器,我认为这是一个更好的方法,只能在一个地方定义监听器的行为。
我不喜欢这样的:
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();
}
};
}
听众,我不能得到关于该项目,只是位置的任何引用里面...
我的印象中我要申报一个监听器的接口并传递给适配器,但我不知道如何。
在视图中声明侦听器还是将它们保存在适配器中作为旧解决方案还有意义吗?
Nop。当您需要适配器的某些东西时,将侦听器放入ViewHolder中对我来说没有任何意义。由于视图在滚动过程中不断被破坏并重新创建,因此您需要在onBind中定义它。如果你的监听器做了一些通用的事情,而不依赖于任何适配器数据,那么把它放在viewHolder中是有意义的。 – Panther
嗨Panther,我的听众做一些依赖于项目的东西(例如点击一个按钮我想分享项目数据)。对于使用相同ViewHolder的2个不同适配器,共享操作具有相同的行为。所以,如果我很好理解你建议将听众保持在适配器内...... – DavideN
是的,我建议你将听者保持在适配器内。但是,由于您提到的行动是相同的,我相信您正在尝试达成DRY解决方案。我会在你的情况下做的是写一个共同的功能来执行所有的股份。监听者只是一个代理人,他将使用适当的数据调用共享操作。 – Panther