我有一个包含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构造函数未被调用,因此他无法设置正确的侦听器。 有什么最好的做法吗?
答案 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
}
}