为什么 ViewHolder 上的 OnClickListener 不起作用?

Why does OnClickListener on a ViewHolder don't work?

我正在尝试实现一种方法来处理 RecyclerView 上的项目选择。我个人不喜欢一些关于 SO 的答案中建议的通过手势的方式,我认为按照 here and here 的建议实施 OnClickListener 更干净。

事实是……这个模式实际上行不通!我真的无法理解为什么我的 OnClickListener.onClick 从未 被调用。这有点像另一种方法在 onClick 可以处理之前拦截点击。

这是我的代码:

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView tvName;
        ImageView star;

        public ViewHolder(View itemView) {
            super(itemView);

            tvName = (TextView) itemView.findViewById(R.id.CHAT_ITEM_name);
            star = (ImageView) itemView.findViewById(R.id.CHAT_ITEM_star);

            Fonts.setTypeface(tvName, regular);
        }

        @Override
        public void onClick(View view) {
            int position = getLayoutPosition();
            select(position);
        }
    }

不幸的是,为了删除它,能够访问被点击项目在整个数据集中的位置对我来说非常重要,所以做类似 indexOfChild 的事情也是不可接受的:我试过了,但是此方法为您提供了项目在列表的 visibile 部分中的位置,因此使 list.remove(position) 不可能。

查看更新后的代码:您没有将 onClickListener 设置为 ViewHolder 中的任何视图。忘记点击监听器是一个可以理解的错误。

只需使用:

tvName.setOnClickListener(this);
star.setOnClickListener(this);

您可以同时设置或只设置其中之一。您也可以简单地获取这两个视图的父布局,以便适配器中的整个项目本身都可以点击。

itemView.setOnClickListener(this);

您可以在 onBindViewHolder 中完成

         @Override
        public void onBindViewHolder(ReportViewHolder holder, int position {
      holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override 
        public void onClick(View arg0) { 
        // handle your click here. 
    } }); 
}

只需单击 Handler 您的 ViewHolder。 Recycler View 没有像 ListView 这样有方法 setOnItemClickListener() 的特殊附加点击处理程序。

** public class ViewHolder 扩展 RecyclerView.ViewHolder 实现 View.OnClickListener

** in public ViewHolder(Context context, View itemView) set public void onClick(View view)

** 通过以下方式获取位置:int position = getLayoutPosition();用户user = users.get(position);