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

Android Kotlin列表单选实现:解决多选异常问题

修复RecyclerView列表单选变多选的问题

问题根源

你的Adapter代码存在两处逻辑错误,导致单选功能失效:

  • 点击新项时,未先保存旧选中位置并通知其刷新,旧选中项的高亮状态不会取消
  • 仅设置了选中项的背景,未给未选中项恢复默认背景

修正后的Adapter代码

override fun onBindViewHolder(holder: PileListeViewHolder, position: Int) {
    val pile = listePiles[position]
    holder.bind(pile)
    val context = holder.binding.root.context

    // 设置选中/未选中的背景状态
    if (selectedItemPosition == holder.adapterPosition) {
        holder.binding.simpleItemPile.background = AppCompatResources.getDrawable(
            context,
            R.drawable.background_bleu_statut
        )
    } else {
        // 恢复未选中项的默认背景,替换为你的实际默认背景资源
        holder.binding.simpleItemPile.background = AppCompatResources.getDrawable(
            context,
            R.drawable.default_item_background
        )
    }

    holder.binding.simpleItemPile.setOnClickListener {
        // 保存旧选中位置
        val oldPosition = selectedItemPosition
        // 更新为新选中位置
        selectedItemPosition = holder.adapterPosition
        
        // 通知旧位置刷新以取消高亮
        oldPosition?.let { notifyItemChanged(it) }
        // 通知新位置刷新以设置高亮
        notifyItemChanged(selectedItemPosition)
        
        onItemSelected(pile)
    }
}

关键修改说明

  1. 背景状态补全:在onBindViewHolder中增加else分支,确保未选中的item能恢复默认背景,每次刷新时都能正确切换选中状态
  2. 点击逻辑优化:
    • 先缓存旧选中位置,再更新为新位置
    • 分别通知旧、新位置的item刷新,保证旧选中项取消高亮,新选中项高亮
    • 简化冗余判断逻辑,让代码更清晰

补充提示

  • 请将代码中的R.drawable.default_item_background替换成你项目中实际使用的列表项默认背景资源
  • 如果需要默认选中某一项,可在Adapter初始化时给selectedItemPosition赋值对应位置,并调用notifyItemChanged刷新该位置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:34:55