安卓系统|点击ViewHolder更新RecyclerView适配器



我希望在单击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通知回收视图

最新更新