我希望在单击ViewHolder项目时,我的"heart"图标会发生更改。幸运的是,它做到了。然而,当多个项目似乎复制了按钮点击时,就会出现问题。
我的意思是:如果我敲击1号物品的心脏。整个列表中的其他项目复制也会改变人心。为什么会发生这种情况,潜在的解决方案是什么?当我引用ViewHolder项目时,我很困惑为什么会出现这个问题。因此,它不应该只影响我正在单击的项目吗?
视图支架
fun bind(item: Location) {
heart.setOnClickListener {
item.fav = item.fav != true
heart.setImageDrawable(
when (item.fav) {
false -> (ContextCompat.getDrawable(itemView.context, R.drawable.ic_border_heart))
else -> (ContextCompat.getDrawable(itemView.context, R.drawable.ic_whole_heart))
})
}
}
onBindViewHolder您需要将收藏夹列表保存在基于该列表的更改项目图像中,否则它会随着视图重新创建而随机更改
fun bind(item: Location) {
heart.setImageDrawable(
when (item.fav) {
false -> (ContextCompat.getDrawable(itemView.context, R.drawable.ic_border_heart))
else -> (ContextCompat.getDrawable(itemView.context, R.drawable.ic_whole_heart))
})
heart.setOnClickListener {
item.fav = item.fav != true
heart.setImageDrawable(
when (item.fav) {
false -> (ContextCompat.getDrawable(itemView.context, R.drawable.ic_border_heart))
else -> (ContextCompat.getDrawable(itemView.context, R.drawable.ic_whole_heart))
})
}
}
您没有在onClick
方法中检查视图ID。您可以直接在视图上设置onClick
,如下所示。
class LocationViewHolder(v: View): RecyclerView.ViewHolder(v), View.OnClickListener {
private val actLoc: TextView = v.findViewById(R.id.location_main)
private val genLoc: TextView = v.findViewById(R.id.location_subtitle)
private val heart: ImageView = v.findViewById(R.id.heart)
private lateinit var item: Location
fun bind(item: Location) {
this.item = item
actLoc.setText(item.actualLocation)
actLoc.setOnClickListener {
Toast.makeText(itemView.context, "${item.cords}", Toast.LENGTH_SHORT).show()
}
genLoc.setText(item.genLocation)
genLoc.setOnClickListener {
Toast.makeText(itemView.context, "${item.cords}", Toast.LENGTH_SHORT).show()
}
heart.setOnClickListener {
item.fav = item.fav != true
heart.setImageDrawable(
when (item.fav) {
false -> (ContextCompat.getDrawable(itemView.context, R.drawable.ic_border_heart))
else -> (ContextCompat.getDrawable(itemView.context, R.drawable.ic_whole_heart))
})
}
}
但是,由于多个项目似乎复制了单击按钮。
这是因为细胞回收机制
heart.setImageDrawable(
when (item.fav) {
false -> (ContextCompat.getDrawable(itemView.context, R.drawable.ic_border_heart))
else -> (ContextCompat.getDrawable(itemView.context, R.drawable.ic_whole_heart))
})
应该是viewholder中bind函数的一部分,而不是onClick函数的部分。我所期望的是
- 点击通知视图模型
- Viewmodel更新数据集
- Viewmodel通知回收视图