如何在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
相关产品推荐
相关产品推荐

