android - RecyclerView多选取消选择错误的ViewHolders
问题描述
在我的ViewHolder
课堂上,我添加了一个名为isOptionSelected
. 基本上,这个属性的作用是控制 a 是否ViewHolder
被选中。我已经做到了,默认情况下会选择所有选项。
在我的OnBindViewHolder()
方法中,我有一个onClickListener()
ViewHolder.itemView (它检测任何点击并调用一个名为的接口方法OnItemClick()
):
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
// Set the text for the itemOption
val optionString = itemOptions[position]
holder.itemOption.text = optionString
// Set the click listener on the view of the holder and send its position
holder.itemView.setOnClickListener {
clickListener.onItemClick(position, it)
notifyDataSetChanged()
}
if (holder.isOptionSelected) {
properties[position] = itemOptions[position]
holder.itemView.setBackgroundColor(activity.resources.getColor(R.color.popup_window_background))
} else {
properties[position] = ""
holder.itemView.setBackgroundColor(activity.resources.getColor(R.color.icons))
}
}
这是我的OnItemClicked
界面:
// Interface to use on the main activity to detect clicks
interface OnItemClicked {
fun onItemClick(position: Int, view: View)
}
这是上的OnItemClick()
方法MainActivity
:
override fun onItemClick(position: Int, view: View) {
val vh = menuItemRecyclerView.getChildViewHolder(view) as MeridesAndSaladsAdapter.ViewHolder
// Invert the boolean value that the vh item holds
vh.isOptionSelected = !vh.isOptionSelected
}
这是我的ViewHolder
课:
class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
var itemOption: TextView = itemView!!.findViewById(R.id.meridesAndSaladsOption)
// All options are selected by default
var isOptionSelected: Boolean = true
}
问题是,当我点击一个ViewHolder.itemView
被取消选择的视图时,我正在点击的视图高出 1-2 行。在我取消选择一些行然后尝试选择一些取消选择的行之后,这些选择似乎是随机的。更重要的是,有时当我取消选择或选择某些东西时,一些额外的行也会改变。
有什么我想念的吗?还是我做错了什么?
解决方案
发生这种情况时,您的 ViewHolders 将被重用,并将其 isOptionsSelected 值重置为默认值 (True)。您需要在 ViewHolder 类之外存储是否选择了项目,并在 onBindViewHolder 中获取/加载值,可能将该值存储为 itemOptions 对象的一部分。此外,需要从您的 onClickListeners 切换这些对象(而不是查看器)的值。
推荐阅读
- php - 致命错误字符串 + 字符串我该如何解决?
- javascript - Unknown column c1 in WHERE clause node.js sql
- python - 使用 matplotlib 生成动画文本
- testing - 如何在 Rust 中使用 mockall 测试单个方法的顺序
- php - Ajax 调用在 localhost 上有效,但在实时站点上在错误日志中返回“调用成员函数 prepare() on null”
- sql - 删除表 PostgreSQL 中的重复条目
- python - 将列值附加到行 pandas
- mysql - 仅当某些值等于某物时,才使用 Where 子句选择语句
- go - 如何使用 AWS SDK Go v2 将 AWS STS Assume 角色与 MFA 结合使用?
- javascript - 尝试将实时 sql 服务器与节点 js 连接