Android:在 onBindViewHolder 中放置 setOnclickListener 或 setOnLongClickListener 是不是正确?
Posted
技术标签:
【中文标题】Android:在 onBindViewHolder 中放置 setOnclickListener 或 setOnLongClickListener 是不是正确?【英文标题】:Android : is correct put setOnclickListener or or setOnLongClickListener in onBindViewHolder?Android:在 onBindViewHolder 中放置 setOnclickListener 或 setOnLongClickListener 是否正确? 【发布时间】:2015-06-30 16:57:06 【问题描述】:我可以将 setOnclickListener 或 setOnLongClickListener 放在 onBindViewHolder 中吗?
这个方法onBindViewHolder
写没问题? (明智与否?)
还是在ViewHolder
写更好?
public void onBindViewHolder(ViewHolder holder, int position)
myBtn.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
//...
);
这种方法对RecyclerView列表的速度有不好的影响吗?
【问题讨论】:
我认为没有其他地方可以放它... @karaokyo 在onBindViewHolder
没问题?
应该没问题。它只是创建和设置一个监听器。这与创建和设置字符串的开销相似。
【参考方案1】:
将它添加到您的 onCreateViewHolder 方法中,这样您就不会搅动侦听器对象。您应该使用vh.getAdapterPosition
将其映射回您的数据。
【讨论】:
【参考方案2】:ViewHolders 基本上是您的 View 对象和 RecyclerView 的内部类的缓存。
由于 RecyclerView.Adapter 是抽象的,你必须实现这三个方法:
public VH onCreateViewHolder(ViewGroup parent, int viewType) public void onBindViewHolder(VH holder, int position) public int getItemCount()
您可以将 RecyclerView.OnItemTouchListener 与手势检测结合使用来识别这些事件。
您可以在自定义适配器实现中添加侦听器。它会是这样的:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>
public interface OnItemClickListener
public void onItemClicked(int position);
public interface OnItemLongClickListener
public boolean onItemLongClicked(int position);
private Fragment mFragment;
public static class ViewHolder extends RecyclerView.ViewHolder
public View v;
public ViewHolder(View v)
super(v);
this.v = v;
public RecyclerViewAdapter(Fragment fragment)
mFragment = fragment;
@Override
public void onBindViewHolder(ViewHolder holder, final int position)
holder.v.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
mFragment.onItemClicked(position);
);
holder.v.setOnLongClickListener(new View.OnLongClickListener()
@Override
public boolean onLongClick(View v)
mFragment.onItemLongClicked(position);
return true;
);
. . .
【讨论】:
这是错误的,你不能在回调中使用位置,因为它可能会改变,不像在 ListView 中,你不会得到另一个回调。有关详细信息,请参阅文档。 加强对yigit的评论,你不应该将位置定为最终,这里是解释:youtube.com/watch?v=imsr8NrIAMs&t=34m53s以上是关于Android:在 onBindViewHolder 中放置 setOnclickListener 或 setOnLongClickListener 是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章
Android DiffUtil::onBindViewHolder 返回从列表中移除的位置
如何将 getIntent.getStringExtra("username") 放入 android 适配器 onBindViewHolder(@NonNull final Vi
Android-RecyclerView系列 RecyclerView滑动后数据显示错乱
RecyclerView ItemClickListener 在 OnBindViewHolder 中不起作用