【问题标题】:How and where to set an OnClickListener listener for two RecyclerView instances如何以及在何处为两个 RecyclerView 实例设置 OnClickListener 侦听器
【发布时间】:2018-02-13 07:01:13
【问题描述】:

我的Activity 中有两个RecyclerView。我为其中一个设置了OnClickListener 并实现了onItemClick 方法。

如果我想设置OnClickListener 并为第二个RecyclerView 实现onItemClick,我该如何实现?

【问题讨论】:

  • 首先,为什么任何人都需要点击Recyclerview,Recyclerview的按钮或文字等项目应该是可点击的。其次,请提供有关您的问题的更多详细信息和代码。
  • 你可以通过 RecyclerAdapter 设置 onClickListner
  • 推荐给RecyclerView添加监听器的方法是让ViewHolder实现监听器,然后在传递给ViewHolder构造函数的View上注册监听器。

标签: java android android-recyclerview onclicklistener


【解决方案1】:

RecyclerView 添加监听器的推荐方法是让ViewHolder 实现监听器,然后在传递给ViewHolder 构造函数的View 上注册监听器。示例:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>    

    public class MyViewHolder extends RecyclerView.ViewHolder implements OnClickListener {
        private TextView textView;

        public MyViewHolder(View view) {
            super(view);
            view.setOnClickListener(this);
            textView = (TextView)view.findViewById(R.id.tv_data);
        }

        @Override
        public void onClick(View v) {
            //do something on click using the position
             int adapterPosition = getAdapterPosition();
       }
   }  
}

如果你有两个 RecyclerView 类,你需要以类似的方式在第二个ViewHolder 实现中设置监听器。

注意:虽然可以通过多种方式为RecyclerView 注册侦听器,但上述方法将ViewHolder 实现定义为适配器类中的内部类,并确保只有需要了解点击的类才包含处理它们的代码。

【讨论】:

    【解决方案2】:

    您可以通过RecyclerviewAdapter 类在RecyclerView 上设置点击列表。

    在适配器类的onBindViewHolder() 内。 (RecyclerView Adapter 类的代码相同)

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        LoadDataResult listPotn = list.get(position);
    
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
                //Call intent or call method of Activity from here.
    
                Context context = v.getContext();
                Intent intent = new Intent(context , Excercise.class);
                context.startActivity(intent);
            }
        });
    }
    

    或者,

    public class ViewHolder extends RecyclerView.ViewHolder {
    TextView product_name;
    
    ViewHolder(View itemView) {
        super(itemView);
        product_name = (TextView) itemView.findViewById(R.id.product_name);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int itemPosition = getLayoutPosition();
                Toast.makeText(getApplicationContext(), itemPosition + ":" + String.valueOf(product_name.getText()), Toast.LENGTH_SHORT).show();
            }
        });
    }
    }
    

    【讨论】:

    • @MostafaPirhayati 我不推荐这种方法,因为它需要创建一个可以避免的新侦听器实例。此外,理想情况下,适配器应该不知道ViewHolder 在单击时会做什么。 Adapter 应该只负责提供 ViewHolder 实例并将数据绑定到其中。请参阅我的答案,了解使用更好的设计原则的方法。
    • @CKing yours answer也是实现clicklistner的好方法,但我的答案也是正确且简单的方法。
    • @AbhisekKumar 如果适配器必须知道如何处理点击,这就是泄漏设计。这不是Adapter 的用途。关注点分离是一个重要的设计原则,违反它会导致类做他们不应该做的事情。上面的答案就是一个例子。 onBindViewHolder 的目的是将数据绑定到视图。没有理由让它与设置侦听器有任何远程关系。实现某件事的方法总是不止一种,人们应该确保他们选择了一种遵循良好设计原则的方法。
    猜你喜欢
    • 2018-01-10
    • 2012-03-05
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多