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

如何在Kotlin中实现RecyclerView单选并切换Item背景颜色

如何在Kotlin中实现RecyclerView单选并切换Item背景颜色

我完全懂你的困扰——现在点哪个分类按钮,哪个就变绿,但没法自动取消之前选中的那个,对吧?要实现这种单选效果,核心就是记录当前选中的位置,每次点击时更新这个位置,再通知Adapter刷新对应Item,就能让选中的保持绿色,其他的恢复默认样式。

下面给你一步步修改代码:

第一步:在Adapter中添加选中状态变量

先在CategoryAdapter里加一个变量,用来保存当前选中的位置,默认设为0(对应你加的"all"选项):

class CategoryAdapter(val categories:MutableList<Category>):RecyclerView.Adapter<CategoryAdapter.ViewHolder>() {
    // 记录当前选中的位置,默认选中第一个(all)
    private var selectedPosition = 0

    // 原有的ViewHolder类和onCreateViewHolder、getItemCount方法保持不变

第二步:修改绑定逻辑,根据选中状态设置背景色

更新onBindViewHolder方法,每次绑定Item时,根据当前位置是否为选中位置来切换背景色:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val category = categories[position]
    holder.categoryButton.text = category.category

    // 根据选中状态设置背景色
    if (position == selectedPosition) {
        holder.categoryButton.setBackgroundColor(Color.GREEN)
    } else {
        // 这里替换成你原来的默认背景色,比如黑色或者主题默认按钮色
        holder.categoryButton.setBackgroundColor(Color.BLACK)
    }

    holder.categoryButton.setOnClickListener {
        // 如果点击的是已经选中的Item,直接返回不用操作
        if (selectedPosition == position) return@setOnClickListener
        
        // 记录之前选中的位置,更新当前选中位置
        val previousSelected = selectedPosition
        selectedPosition = position
        
        // 只刷新前后两个选中的Item,比全量刷新性能更好
        notifyItemChanged(previousSelected)
        notifyItemChanged(selectedPosition)
    }
}

这样改完之后,每次点击新的分类按钮,之前选中的按钮会自动恢复默认背景色,当前点击的变成绿色,完美实现单选效果!

额外优化建议

  • 不要硬编码颜色值(比如Color.GREEN),建议在res/values/colors.xml里定义颜色资源,比如:
    <color name="selected_green">#FF00C851</color>
    <color name="default_button_black">#FF000000</color>
    
    然后用ContextCompat.getColor(holder.itemView.context, R.color.selected_green)来引用,后续改颜色更方便,也符合Android开发规范。
  • 你之前用GlobalScope存在内存泄漏风险,建议换成lifecycleScope(需要在app模块的build.gradle里添加依赖implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.2"),这样协程会和Activity生命周期绑定,更安全。比如把PrimaryActivity里的GlobalScope.launch改成lifecycleScope.launch。

备注:内容来源于stack exchange,提问作者Amir Elahi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 12:18:02