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

时间:2015-07-25 13:41:12

标签: android onclick onclicklistener android-recyclerview

我正在尝试实现一种处理RecyclerView项目选择的方法。我个人不喜欢在通过手势的一些答案中建议的方式,我认为按照建议herehere实施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这样的事情也是不可接受的:我试过,但是这个method为您提供列表中 visibile 部分中项目的位置,从而使list.remove(position)无法使用。

3 个答案:

答案 0 :(得分:47)

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

只需使用:

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

您可以设置为两者或仅设置其中一个。您还可以简单地获取这两个视图的父布局,以便适配器中的整个项目本身可以单击。

itemView.setOnClickListener(this);

答案 1 :(得分:3)

您可以在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. 
    } }); 
}

答案 2 :(得分:0)

只需单击“处理您的ViewHolder”。 Recycler View没有特殊的附加单击处理程序,例如ListView,它具有setOnItemClickListener()方法。

** 公共类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener

** 在公共ViewHolder(上下文上下文,View itemView)中设置public void onClick(查看视图)

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