android - RecyclerView 的监听器被应用到其他 RecyclersView
问题描述
好吧,我现在正在与 Kotling 一起工作,并且我在onBindViewHolder
里面有一个监听ViewHolderAdapter
器,但是,这个监听器的行为被应用于每 10 个位置。当我触摸该图像时,该行为只是使用滤色器更改图像颜色。很简单。
我尝试过使用holder.setIsRecyclable(false)
,但是当回收器离开屏幕时,图像变为正常设计,而不是更红。
这是我的ViewHolderAdapter
class ViewHolderAdapter(private var products:List<EachProduct>):RecyclerView.Adapter<ViewHolderAdapter.ViewHolder>(){
override fun onCreateViewHolder(parent:ViewGroup,viewType:Int):ViewHolder{
val view=LayoutInflater.from(parent.context).inflate(R.layout.recyclerview_layout,parent,false)
return ViewHolder(view)
}
override fun getItemCount():Int{
return products.size
}
override fun onBindViewHolder(holder:ViewHolder,position:Int){
//holder.setIsRecyclable(false)
holder.likeImage.setOnClickListener{
holder.likeImage.setColorFilter(Color.RED)
}
}
class ViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){
var likeImage:ImageView=itemView.LikeImage
}
}
我预计只有被触摸的 RecyclerView 的图像会发生变化,而不是例如每 10 行发生一次。有人可以为我提供一个关于如何在 RecyclerView 中的图像内设置侦听器的示例吗?
解决方案
ImageView.setColorFilter()
将ColorFilter
对象分配给ImageView
. 这意味着当您ViewHolder
被回收并重新绑定到新图像时,ColorFilter
它仍然存在并且将应用于加载的任何图像。
此外,如果您向上和向下滚动,不能保证ViewHolder
相同的位置将用于相同的位置。
您需要做的是以某种方式将图像存储在您的数据集中,无论图像是否应该应用过滤器。例如,也许您存储最后点击的位置:
var lastClickedPosition = -1
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
if (position == lastClickedPosition) {
holder.likeImage.setColorFilter(Color.RED)
} else {
holder.likeImage.setColorFilter(null)
}
holder.likeImage.setOnClickListener {
val previousPosition = lastClickedPosition
lastClickedPosition = position
notifyItemChanged(position)
if (previousPosition != -1) {
notifyItemChanged(previousPosition)
}
}
}
或者,也许您希望能够一次将过滤器应用于多行。然后也许您可以将一个字段添加到支持您的适配器的任何列表中,或者创建一组可变的突出显示位置:
val clickedPositions = mutableSetOf<Int>()
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
if (clickedPositions.contains(position)) {
holder.likeImage.setColorFilter(Color.RED)
} else {
holder.likeImage.setColorFilter(null)
}
holder.likeImage.setOnClickListener {
clickedPositions.add(position)
notifyItemChanged(position)
}
}
推荐阅读
- c# - SSH.NET 公钥认证
- r - 如果使用 case_when,则对两个或更多列进行变异
- android - 在有两个 ConstraintLayout 时将其置于 Button 前面
- sql-server - 多部分标识符“System.Data.DataRowView”无法在 vb.net 中绑定
- postgresql - 外部表插入不使用远程序列
- python - 你如何使用附加功能,然后从列表中删除一个形状?
- java - 自适应优先队列中位置的使用
- assembly - 在汇编中将一个数组的内容复制到另一个数组
- javascript - 使用 onclick 方法改变颜色的可点击网格
- c# - 如何从不同的项目中读取文件?