为什么在RecyclerView.Adapter的onBindViewHolder中添加OnClickListener被认为是不好的做法? [英] Why is adding an OnClickListener inside onBindViewHolder of a RecyclerView.Adapter considered bad practice?

查看:165
本文介绍了为什么在RecyclerView.Adapter的onBindViewHolder中添加OnClickListener被认为是不好的做法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 RecyclerView.Adapter 类的以下代码,它运行正常:

I have the following code for a RecyclerView.Adapter class and it works fine:

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

However, I believe it is bad practice to implement the OnClickListener in the onBindViewHolder method. Why is this bad practice, and what is a better alternative?

推荐答案

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

The reason it is better to handle your click logic inside the ViewHolder is because it allows for more explicit click listeners. As expressed in the Commonsware book:


ListView行中的可点击小部件(如RatingBar)长期以来与行上的点击事件冲突他们自己。获取可以单击的行,行内容也可以单击,有时会有点棘手。使用RecyclerView,您可以更明确地控制如何处理这类事情...因为您是设置所有点击处理逻辑的人。

Clickable widgets, like a RatingBar, in a ListView row had long been in conflict with click events on rows themselves. Getting rows that can be clicked, with row contents that can also be clicked, gets a bit tricky at times. With RecyclerView, you are in more explicit control over how this sort of thing gets handled… because you are the one setting up all of the on-click handling logic.

通过使用ViewHolder模型,您可以在RecyclerView中获得比以前ListView中的点击处理更多的好处。我在博客文章中写了这篇文章来比较差异 - https://androidessence.com/android / recyclerview-vs-listview /

By using the ViewHolder model you can gain a lot of benefits for click handling in a RecyclerView than previously in the ListView. I wrote about this in a blog post comparing the differences - https://androidessence.com/android/recyclerview-vs-listview/

至于为什么它在ViewHolder中更好而不是在 onBindViewHolder(),这是因为为每个项目调用了 onBindViewHolder(),设置点击监听器是一个不必要的选项,当你可以在你的ViewHolder构造函数。然后,如果您的点击响应取决于所点击项目的位置,您只需从ViewHolder中调用 getAdapterPosition()即可。 这里是我给出的另一个答案,演示了如何使用<来自ViewHolder类的code> OnClickListener 。

As for why it is better in the ViewHolder instead of in onBindViewHolder(), that is because onBindViewHolder() is called for each and every item and setting the click listener is an unnecessary option to repeat when you can call it once in your ViewHolder constructor. Then, if your click responds depends on the position of the item clicked, you can simply call getAdapterPosition() from within the ViewHolder. Here is another answer I've given that demonstrates how you can use the OnClickListener from within your ViewHolder class.

这篇关于为什么在RecyclerView.Adapter的onBindViewHolder中添加OnClickListener被认为是不好的做法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆