一尘不染

为什么在RecyclerView.Adapter的onBindViewHolder中添加OnClickListener被认为是不好的做法?

java

我有一个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是一种不好的做法。为什么会有这种不好的做法,还有什么更好的选择?


阅读 939

收藏
2020-09-08

共1个答案

一尘不染

最好在ViewHolder中处理单击逻辑的原因是,它允许更明确的单击侦听器。如Commonsware书中所述:

很久以来,ListView行中的可单击小部件(如RatingBar)一直与行本身的单击事件发生冲突。获取可以单击的行以及也可以单击的行内容有时会有些棘手。使用RecyclerView,您可以更加明确地控制如何处理此类事件……因为您是负责设置所有单击处理逻辑的人。

通过使用ViewHolder模型,与以前在ListView中相比,RecyclerView中的单击处理可以获得很多好处。我在比较差异的博客文章中写道-
https: //androidessence.com/recyclerview-vs-
listview

至于为什么用ViewHolder而不是in更好onBindViewHolder(),这是因为onBindViewHolder()每个项目都被调用并设置单击侦听器是不必要的选项,当您可以在ViewHolder构造函数中一次调用它时就可以重复。然后,如果您的单击响应取决于单击的项目的位置,则只需getAdapterPosition()在ViewHolder中调用即可。是我给出的另一个答案,展示了如何OnClickListener在ViewHolder类中使用from。

2020-09-08