我在stackOverflow上阅读了一些关于如何在recycleView行上实现点击并最终获得此版本的答案:
ViewHolder:
public class ContactViewHolder extends RecyclerView.ViewHolder {
private final TextView text_name;
private final IContactClick listener;
public ContactViewHolder(View itemView, IContactClick _listener) {
super(itemView);
text_name = (TextView) itemView.findViewById(R.id.text_name);
listener = _listener;
}
public void bind(final Contact model) {
text_name.setText(model.name);
itemView.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
listener.contactClick(model);
}
});
}
public interface IContactClick {
void contactClick(Contact contact);
}
}
Adaptar:
public class ContactsAdapter extends RecyclerView.Adapter<ContactViewHolder> implements ContactViewHolder.IContactClick{
private final LayoutInflater mInflater;
private final List<Contact> mModels;
public ContactsAdapter(Context context, List<Contact> models) {
mInflater = LayoutInflater.from(context);
mModels = new ArrayList<>(models);
}
public void contactClick(Contact contact) {
Log.d("contactClick", contact.name);
}
...
我不得不将模型更改为final,因此我可以在回调中使用它。这似乎有效。我想知道这是否是一个很好的做法,然后继续前进。
干杯
答案 0 :(得分:0)
我没有使用过RecyclerView
,但我认为此方法也适用于ListView
。我以这种方式实现我的ListAdapter
,因为它以某种方式给出了解耦的感觉。例如,如果您想在多个Adapter
/ ListView
中使用相同的RecyclerView
(例如,具有相同的行视图/但不同的点击行为),此方法可让您执行此操作
PS:我还没有为上述配置找到一个用例,但我还是认为去耦会给我带来好处。
关于你对传球模型本身的关注(从而使其成为最终),我认为这不是一个问题。我通过这种方式实现了很多ListView
个。如果你有一个简单的RecyclerView
,你可以将position
传递给你的点击处理程序,而Fragment
/ Activity
则可以调用Adapter#getItem(position)
来获取模型。< / p>