Recycler View编辑模式需要在同一项目视图中实现两个itemClickListener:每个模式的状态一个

时间:2018-01-26 00:55:51

标签: android performance android-recyclerview onclicklistener android-viewholder

我有一个包含Recycler视图的活动,在这个活动中实现了很多应用程序的编辑模式。每一件事情都运作良好但我有一些表现问题,并且我试图在害虫实践中更深入。

用户进入编辑模式,选择工具栏中的menuItem放置在活动中,因此在活动的menuItemClickListener中我调用适配器的方法,用于告诉用户想要进入编辑模式:

mAdapter.setEditMode(true);

然后在适配器中:

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

现在最困难的部分:当editMode变量设置为true时,我需要更改itemClickListener,因此与持有者的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构造函数未被调用,因此他无法设置正确的侦听器。 有什么最好的做法吗?

1 个答案:

答案 0 :(得分:1)

在搜索了有关clickListener最佳位置的各种StackOverFlow答案后,人们似乎在多个实现之间进行划分。以下是我在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 : 在创建Viewholder类时,允许它实现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
  }
}