Recycler View编辑模式需要在同一个itemview中实现两个itemClickListener:每个模式状态一个

Recycler View edit mode needs to implement two itemClickListener in the same itemview: one for each mode's state

我有一个 activity,其中包含一个回收器视图,在这个 activity 中实现了像许多应用程序一样的编辑模式。一切正常,但我有一些性能问题,我正在尝试更深入地研究害虫实践。

用户通过 select 工具栏中位于 activity 中的 menuItem 进入编辑模式,因此在 activity 中的 menuItemClickListener 中我调用了适配器的方法用来告诉他用户想进入编辑模式:

mAdapter.setEditMode(true);

然后在适配器中:

public void setEditMode(boolean editMode){
    this.editMode = editMode;
    notifyDataSetChanged(); //in order to change the items layout
} 

现在是最困难的部分:当 editMode 变量设置为 true 时,我需要更改 itemClickListener,因此与 holder 的 itemView 关联的侦听器会发生动态变化。我在 onBindViewHolder 中做这个思考,这样我就可以在编辑模式变量更改时设置正确的侦听器。

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder,int position) {
    if(editMode){
        holder.itemView.setOnClickListener(listener1);
    }
    else{
        holder.itemView.setOnClickListener(listener2);
    }
}

这个解决方案有效,但我知道在 onBindViewHolder 方法中放置一个监听器是一种不好的做法,所以我想找到一个允许在 viewHolder 构造函数中实现监听器的解决方案。 这并不简单,因为当 editMode 变量发生变化时,viewHolder 构造函数没有被调用,所以他无法设置正确的监听器。 有什么最佳实践可以做到这一点吗?

在搜索了有关 clickListener 最佳位置的各种 Whosebug 答案后,人们似乎被分为多个实现。这是我在 ViewHolder 中添加侦听器所知道的。

1.适配器: 在您的适配器中,覆盖 onCreateViewHolder() 方法

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
{
    View view = LayoutInflater.from(//pass in your args);
     ImageView imageview1 = //init your views
    TextView textView = //init your views
    return new MyViewHolder(view, textView);
}

2。取景器: 当您创建 Viewholder class 时,允许它实现 View.OnClickListener 并覆盖那里的 onClick 方法。

public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
  public ImageView imageView1;

  private MyViewHolder(View itemView, ImageView imageView) {
        super(itemView);
        itemView.setOnClickListener(this);
        imageView1 = imageView;
  }

  @Override
  public void onClick(View view) {
        //Implement your click functionality here
  }
}