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 中不起作用

如何在“onBindViewHolder”中获取recyclerview项目的高度

Android的RecyclerView.Adapter类使用了泛型,这个类是怎样定义的?