我在 stackOverflow 上阅读了一些关于如何实现对 recycleView 行的点击的答案,并最终得到了这个版本:
View 持有者:
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);
}
}
适配器:
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);
}
...
我必须将模型更改为最终模型,以便我可以在回调中使用它。这似乎有效。在继续之前,我想知道这是否是一个好的做法。
干杯
最佳答案
我没有使用过RecyclerView
,但我认为这种方法也适用于ListView
。我以这种方式实现我的 ListAdapter
是因为它以某种方式给人一种解耦的感觉。例如,如果您想在多个 ListView
/RecyclerView
中使用相同的 Adapter
(例如,具有相同的行 View /但不同的点击行为),这种方法可以让您做到这一点。
PS:我还没有找到上述配置的用例,但我认为解耦会给我带来优势。
关于您对传递模型本身的担忧(从而使其成为最终模型),我认为这从来都不是问题。我已经用这种方式实现了许多 ListView
。不过,如果您有一个简单的 RecyclerView
,您可以将 position
传递给您的点击处理程序,并且在 Fragment
/Activity
中,您可以调用 Adapter#getItem(position)
来获取模型。
关于java - 实现点击recycleView行的正确方法 - 传递模型本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36396081/