首页 > 解决方案 > 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 行。在我取消选择一些行然后尝试选择一些取消选择的行之后,这些选择似乎是随机的。更重要的是,有时当我取消选择或选择某些东西时,一些额外的行也会改变。

有什么我想念的吗?还是我做错了什么?

标签: androidkotlinandroid-recyclerview

解决方案


发生这种情况时,您的 ViewHolders 将被重用,并将其 isOptionsSelected 值重置为默认值 (True)。您需要在 ViewHolder 类之外存储是否选择了项目,并在 onBindViewHolder 中获取/加载值,可能将该值存储为 itemOptions 对象的一部分。此外,需要从您的 onClickListeners 切换这些对象(而不是查看器)的值。


推荐阅读