Android 循环视图处理内部imageView的setOnClickListener

Android 循环视图处理内部imageView的setOnClickListener,android,android-recyclerview,onitemclicklistener,Android,Android Recyclerview,Onitemclicklistener,我已经实现了ListView,它工作得非常好。每个列表条目都包含ImageView和TextView。缩略图和标题 我在ListviewAdaper中实现了imageView.setOnItemClick(),它显示TextView,然后在imageView上再次单击它,使TextView消失 现在我转到了布局相同的RecyclerView(ImageView和TextView) 在myRecyclerAdapter的public void onBindViewHolder()中添加了与列表视图

我已经实现了
ListView
,它工作得非常好。每个列表条目都包含
ImageView
TextView
。缩略图和标题

我在
ListviewAdaper
中实现了
imageView.setOnItemClick()
,它显示
TextView
,然后在
imageView
上再次单击它,使
TextView
消失

现在我转到了布局相同的
RecyclerView
ImageView
TextView

在my
RecyclerAdapter
public void onBindViewHolder()
中添加了与列表视图中实现的代码相同的代码

    public void onBindViewHolder(MyViewHolder holder, int position) {
    imageview = holder.image;
    textview = holder.text;
    imageview.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (type != MyGlobals.DATA_TYPE1) {
                if (subtitle.getVisibility() == View.VISIBLE) {
                    imageview.startAnimation(rotate_backward);
                    textview.setVisibility(View.GONE);
                } else {
                    imageview.startAnimation(rotate_forward);
                    textview.setVisibility(View.VISIBLE);
                }
            }
        }
    });

    }
这里的问题是,如果我的
RecyclerView
条目超过1个,并且我单击任何
RecyclerView
条目的任何
ImageView
条目,则只有最后一个entrie的
TextView
可见/消失,而不是相应的entrie的
TextView

当我打开调试器并在
ImageView
onClick
处中断时,它实际上显示了最后一个条目的
TextView
RecyclerView

如何独立处理每个
RecyclerView
条目的
ImageView
,以使相应的
TextView
可见/消失


只是我对每个条目的
OnClickListener
OnLongClickListener
做了一个注释,它们都很好地工作了。

您正在做的方法不是很好,因为它在每个
bindHolder
回调上都创建了一个新的匿名内部类。这只是一种内存浪费和GC过载,没有什么好的理由

出现此问题的实际原因是,您使用
image=holder.image获取对图像的引用但在下一次访问时,此引用丢失

通过一种更为独立的方法,我们可以处理这两个问题。为此,请将其添加到您的ViewHolder中

  static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

      ImageView imageView;

      public MyViewHolder(View itemView) {
         super(itemView);
         imageView = (ImageView) itemView.findViewById(R.id.image);
         imageView.setOnClickListener(this);
      }

      @Override
      public void onClick(View v) {
           // do your action here with imageView
      }
   }

然后从您的
onBindViewHolder

中删除所有
单击
相关代码。您所采用的方法不是很好,因为它在每个
bindHolder
回调上创建了一个新的匿名内部类。这只是一种内存浪费和GC过载,没有什么好的理由

出现此问题的实际原因是,您使用
image=holder.image获取对图像的引用但在下一次访问时,此引用丢失

通过一种更为独立的方法,我们可以处理这两个问题。为此,请将其添加到您的ViewHolder中

  static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

      ImageView imageView;

      public MyViewHolder(View itemView) {
         super(itemView);
         imageView = (ImageView) itemView.findViewById(R.id.image);
         imageView.setOnClickListener(this);
      }

      @Override
      public void onClick(View v) {
           // do your action here with imageView
      }
   }
然后从您的
onBindViewHolder中删除所有
单击
相关代码
您可以使用此

 public void onBindViewHolder(MyViewHolder holder, int position) {

 holder.imageview.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

      // Your image click code

     }
  });

 }
你可以用这个

 public void onBindViewHolder(MyViewHolder holder, int position) {

 holder.imageview.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

      // Your image click code

     }
  });

 }

非常感谢。这起作用了。每个recylclerview条目都是(图像、标题、子标题、计数),它是一个单独的类对象,其列表数据列表被填充。要访问onClick中的单个条目(在我的例子textview中),如果需要对特定的列表条目进行操作,我可以通过dataList.get(getAdapterPosition())获取条目。很高兴它起到了作用。另一种方法是在绑定期间将数据实例添加到Holder中,如
Holder.data=dataList.get(position)
,因此在单击期间,它就在那里,如果您有多行类型
if(imageView!=null)imageView.setOnClickListener(此)谢谢。这起作用了。每个recylclerview条目都是(图像、标题、子标题、计数),它是一个单独的类对象,其列表数据列表被填充。要访问onClick中的单个条目(在我的例子textview中),如果需要对特定的列表条目进行操作,我可以通过dataList.get(getAdapterPosition())获取条目。很高兴它起到了作用。另一种方法是在绑定期间将数据实例添加到Holder中,如
Holder.data=dataList.get(position)
,因此在单击期间,它就在那里,如果您有多行类型
if(imageView!=null)imageView.setOnClickListener(此)