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
}
}
我有一个 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
}
}