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
)
在myRecyclerAdapter
的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(此)代码>