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) } }
关键修改说明
- 背景状态补全:在
onBindViewHolder中增加else分支,确保未选中的item能恢复默认背景,每次刷新时都能正确切换选中状态 - 点击逻辑优化:
- 先缓存旧选中位置,再更新为新位置
- 分别通知旧、新位置的item刷新,保证旧选中项取消高亮,新选中项高亮
- 简化冗余判断逻辑,让代码更清晰
补充提示
- 请将代码中的
R.drawable.default_item_background替换成你项目中实际使用的列表项默认背景资源 - 如果需要默认选中某一项,可在Adapter初始化时给
selectedItemPosition赋值对应位置,并调用notifyItemChanged刷新该位置
内容的提问来源于stack exchange,提问作者eya tayari
相关产品推荐
相关产品推荐

