如何将RecyclerView选中项与首项交换并更改背景色
RecyclerView选中项背景色修改及置顶问题修复
问题根源
- 调用
notifyItemMoved后仅触发视图动画,未实际修改数据集顺序,导致后续position与dataset的对应关系错乱 - 选中位置
selectedItemPos未更新为新的置顶位置(0),背景色判断逻辑失效 - 未通知适配器刷新相关视图,旧选中状态残留
修正后的代码
override fun onBindViewHolder(holder: FeelingsViewHolder, position: Int) { val item = dataset[position] holder.title.text = context.resources.getString(item.stringResourceId) holder.emoji.setImageResource(item.imageResourceId) // 处理背景色设置 holder.itemView.setBackgroundColor( if (selectedItemPos == position) Color.parseColor("#200f726b") else Color.parseColor("#ffffff") ) holder.emoji.setOnClickListener { // 1. 手动调整数据集顺序:移除选中项并添加到首位 val selectedItem = dataset.removeAt(position) dataset.add(0, selectedItem) // 2. 更新选中位置为新的置顶位置 selectedItemPos = 0 // 3. 通知适配器数据变化,确保视图正确刷新 notifyItemMoved(position, 0) notifyItemRangeChanged(0, dataset.size) // 精准刷新受影响的视图范围 } } override fun getItemCount() = dataset.size
关键优化点
- 同步修改数据集:RecyclerView动画不会自动修改数据源,必须手动调整
dataset才能保证后续交互的正确性 - 更新选中位置标记:项移到首位后,选中位置固定为0,确保背景色判断逻辑准确
- 精准刷新视图:用
notifyItemRangeChanged替代notifyDataSetChanged,只刷新受影响的视图范围,性能更优
内容的提问来源于stack exchange,提问作者Vishal Thakur
相关产品推荐
相关产品推荐

