Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么ViewHolder上的OnClickListener不';不行?_Android_Onclick_Onclicklistener_Android Recyclerview - Fatal编程技术网

Android 为什么ViewHolder上的OnClickListener不';不行?

Android 为什么ViewHolder上的OnClickListener不';不行?,android,onclick,onclicklistener,android-recyclerview,Android,Onclick,Onclicklistener,Android Recyclerview,我正在尝试实现一种在RecyclerView上处理项目选择的方法。我个人不喜欢一些答案中建议的传递手势的方式,我认为实现一个OnClickListener,就像建议的那样,是非常干净的 事实是。。。这种模式实际上不起作用!我真的无法理解为什么我的OnClickListener.onClick从未被调用。这有点像另一种方法在onClick处理它之前拦截单击 这是我的代码: public class ViewHolder extends RecyclerView.ViewHolder imp

我正在尝试实现一种在
RecyclerView
上处理项目选择的方法。我个人不喜欢一些答案中建议的传递手势的方式,我认为实现一个
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
这样的操作也是不可接受的:我尝试过,但此方法会为您提供项在列表可视部分的位置,从而使
list.remove(位置)
不可能。

查看更新的代码:您没有将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. 
    } }); 
}

简单地单击ViewHolder。回收器视图没有特殊的附加单击处理程序,如ListView,它具有setOnItemClickListener()方法

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

**在公共视图持有者(上下文上下文,视图项视图)中,单击(视图视图)设置公共void


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

但它可以工作。你能发布你的ViewHolder的所有代码吗?这样我们就可以看到缺少了什么?@androidpotato7当然-刚刚更新了代码!此方法对性能而言不是最优的。!!!在ViewHolder的构造函数中更有效地设置Click listeners。每次在RecyclerView中显示新项时都会调用onBindViewHolder()方法,因此,如果您有一个非常大的列表,您最终会不必要地创建数百个甚至更多的Click listeners。在ViewHolder中创建侦听器会将创建的侦听器数量限制在合理的范围内。(大致相当于屏幕上的项目数)我同意,特别是如果项目数是动态的而不是静态的。多么糟糕的设计,你必须实际设置它,而仅仅覆盖
onClick
是不起作用的。非常直观:-\