我有一个RecyclerView.Adapter类的以下代码,它工作正常:
RecyclerView.Adapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.Viewholder> { private List<Information> items; private int itemLayout; public MyAdapter(List<Information> items, int itemLayout){ this.items = items; this.itemLayout = itemLayout; } @Override public Viewholder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false); return new Viewholder(v); } @Override public void onBindViewHolder(Viewholder holder, final int position) { Information item = items.get(position); holder.textView1.setText(item.Title); holder.textView2.setText(item.Date); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(view.getContext(), "Recycle Click" + position, Toast.LENGTH_SHORT).show(); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Toast.makeText(v.getContext(), "Recycle Click" + position, Toast.LENGTH_SHORT).show(); return true; } }); } @Override public int getItemCount() { return items.size(); } public class Viewholder extends RecyclerView.ViewHolder { public TextView textView1; public TextView textView2; public Viewholder(View itemView) { super(itemView); textView1=(TextView) itemView.findViewById(R.id.text1); textView2 = (TextView) itemView.findViewById(R.id.date_row); } } }
但是,我认为在该onBindViewHolder方法中实现OnClickListener是一种不好的做法。为什么会有这种不好的做法,还有什么更好的选择?
onBindViewHolder
最好在ViewHolder中处理单击逻辑的原因是,它允许更明确的单击侦听器。如Commonsware书中所述:
很久以来,ListView行中的可单击小部件(如RatingBar)一直与行本身的单击事件发生冲突。获取可以单击的行以及也可以单击的行内容有时会有些棘手。使用RecyclerView,您可以更加明确地控制如何处理此类事件……因为您是负责设置所有单击处理逻辑的人。
通过使用ViewHolder模型,与以前在ListView中相比,RecyclerView中的单击处理可以获得很多好处。我在比较差异的博客文章中写道- https: //androidessence.com/recyclerview-vs- listview
至于为什么用ViewHolder而不是in更好onBindViewHolder(),这是因为onBindViewHolder()每个项目都被调用并设置单击侦听器是不必要的选项,当您可以在ViewHolder构造函数中一次调用它时就可以重复。然后,如果您的单击响应取决于单击的项目的位置,则只需getAdapterPosition()在ViewHolder中调用即可。这是我给出的另一个答案,展示了如何OnClickListener在ViewHolder类中使用from。
onBindViewHolder()
getAdapterPosition()
OnClickListener