滚动后选中的复选框在recyclerview中变为未选中

Posted

技术标签:

【中文标题】滚动后选中的复选框在recyclerview中变为未选中【英文标题】:checked checkbox become unchecked in recyclerview after scrolling 【发布时间】:2021-12-16 13:32:24 【问题描述】:

我有一个带有项目列表的回收视图,当我检查一个项目并滚动直到选中的复选框消失,然后再次滚动到它时,复选框变为未选中

这是我的适配器代码

class ContactsAdapter(var list:ArrayList<contact>, private val listener: (contact) -> Unit):RecyclerView.Adapter<ContactsAdapter.viewHolder>() 

    inner class viewHolder(view:View):RecyclerView.ViewHolder(view)
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): viewHolder 
        var view = LayoutInflater.from(parent.context).inflate(R.layout.item_ui, parent, false)
        return viewHolder(view)
    
    override fun onBindViewHolder(holder: viewHolder, position: Int) 
        var itemPosition = list[position]
        holder.itemView.apply 
            contact_name.text=itemPosition.contactName
            contact_number.text=itemPosition.contactNumber[0]
            check_number.setOnClickListener 
                listener(itemPosition)
            
            check_number.isChecked = itemPosition.checked

    
    override fun getItemCount(): Int 
       return list.size
    

【问题讨论】:

【参考方案1】:

RecyclerView 回收其行。你的setOnClickListener() 需要做一些事情来保持哪些项目被选中和未选中,你的onBindViewHolder() 需要在绑定项目时更新CheckBox。似乎第二部分已经实现,但可能不是第一部分。您可能需要在您的 lambda 中为 setOnClickListener() 更新 itemPosition.checked

【讨论】:

谢谢,我按照您的指示保存了支票,但我还有另一个问题,假设我有 20 个项目,我检查了第 3 个项目,当我继续滚动时,我发现随机项目也被检查了! @AnasHafidi:RecyclerView 回收其行。这意味着当用户滚动时,某个先前项目的CheckBox 将被重新用于某些新项目。确保在每次 onBindViewHolder() 调用中始终更新 CheckBox 以反映新绑定项目的选中状态。除此之外,使用调试或Log 调用来查看您在哪里/如何更新CheckBox 小部件,以及您在哪里/如何根据用户检查CheckBox 更新数据。 感谢您的帮助,我按照您的指示修复了它。

以上是关于滚动后选中的复选框在recyclerview中变为未选中的主要内容,如果未能解决你的问题,请参考以下文章

滚动列表视图 BaseAdapter 上的复选框选中/未选中状态更改

滚动后未选中 ListView 适配器中的 Android 复选框

取消选择并向下滚动后,列表视图中的复选框被选中。

如何在活动启动时在recyclerview中显示已选中的复选框(多对多关系)

需要将选中的(多个)RecyclerView项目行用复选框放到另一个有RecyclerView的Activity中。

js 怎么把所有选中的复选框 都变为 未选中状态