0

我希望当我的 ViewHolder 项目被点击时我的“心”图标会改变。幸运的是,它做到了这一点。但是,由于多个项目似乎复制了按钮单击,因此出现了问题。

我的意思是:如果我在第 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))
                })

            }
        }
4

3 回答 3

1

您没有在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))
            })

    }
}
于 2020-09-15T07:49:27.443 回答
1

onBindViewHolder 您需要根据该列表保存更改项目图像中的最爱列表,否则它会在视图重新创建时随机更改

于 2020-09-15T07:50:40.987 回答
0

但是,由于多个项目似乎复制了按钮单击,因此出现了问题。

这是因为细胞回收机制

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 中绑定函数的一部分,而不是 onClick 函数的一部分。我期望的是

  • 单击通知视图模型
  • Viewmodel 更新数据集
  • Viewmodel 通知recyclerview
于 2020-09-15T07:47:13.197 回答