You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RecyclerView CheckBox自动勾选异常:勾选一项后11-12项莫名选中

问题描述

勾选RecyclerView中的某个复选框后,第11-12项的复选框会自动被勾选(未手动点击),推测问题出在ViewHolder的位置处理逻辑上,以下是相关代码:

Adapter ViewHolder代码

inner class ProductListViewHolder(val itemBinding: SelectProductLayoutBinding) :
    RecyclerView.ViewHolder(itemBinding.root) {
    fun bindItems(data: ManufacturingProductItem, position: Int) {
        if (data.name != null)
            itemBinding.userNameTv.text = data.name
        else
            itemBinding.userNameTv.text = ""
        itemBinding.userNameTv.setOnClickListener {
            listener.onProductClickListener(
                data,
                itemBinding.userNameTv.isChecked
            )
        }
    }
}

RecyclerView分页相关代码

binding.productRv.addOnScrollListener(object : RecyclerView.OnScrollListener() {
        override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
            super.onScrollStateChanged(recyclerView, newState)
            if (newState != RecyclerView.SCROLL_STATE_IDLE) {
                return
            }
            if (!recyclerView.canScrollVertically(1)) {
                if (productAdapter.getProductResponseList.size > 2) {
                    count++
                    productPresenter.getProducts("", count.toString(), true)
                }
            }
        }
    })
解决方案

这是RecyclerView的ViewHolder复用机制导致的问题:当列表滚动时,离开屏幕的ViewHolder会被复用到新进入屏幕的item位置,而你当前的bindItems方法没有根据数据的选中状态同步复选框状态,导致旧的选中状态被带到了新item上。

修改步骤:

  1. 在ManufacturingProductItem类中添加isChecked字段,用来记录当前item的选中状态:
data class ManufacturingProductItem(
    // 原有字段
    val name: String?,
    // 新增选中状态字段
    var isChecked: Boolean = false
)
  1. 修改ViewHolder的bindItems方法,将复选框状态与数据绑定,点击时同步更新数据状态:
inner class ProductListViewHolder(val itemBinding: SelectProductLayoutBinding) :
    RecyclerView.ViewHolder(itemBinding.root) {
    fun bindItems(data: ManufacturingProductItem, position: Int) {
        // 设置文本
        itemBinding.userNameTv.text = data.name ?: ""
        
        // 关键:根据数据状态设置复选框状态
        itemBinding.userNameTv.isChecked = data.isChecked
        
        itemBinding.userNameTv.setOnClickListener {
            // 更新数据的选中状态
            data.isChecked = itemBinding.userNameTv.isChecked
            listener.onProductClickListener(data, data.isChecked)
            // 可选:局部刷新当前item,避免状态混乱
            // productAdapter.notifyItemChanged(position)
        }
    }
}

补充说明

你提供的分页代码逻辑无问题,无需修改。核心问题是未将复选框状态与数据源绑定,导致复用ViewHolder时状态混乱。

内容的提问来源于stack exchange,提问作者user2357113

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:20:38