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

如何将RecyclerView选中项与首项交换并更改背景色

RecyclerView选中项背景色修改及置顶问题修复

问题根源

  1. 调用notifyItemMoved后仅触发视图动画,未实际修改数据集顺序,导致后续position与dataset的对应关系错乱
  2. 选中位置selectedItemPos未更新为新的置顶位置(0),背景色判断逻辑失效
  3. 未通知适配器刷新相关视图,旧选中状态残留

修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:33:23