Android Kotlin实现RecyclerView单选按钮背景切换功能求助
解决方案
要实现RecyclerView的单选功能,你需要统一管理选中状态,而非让每个Item各自维护独立状态。以下是修改后的完整代码及关键改动说明:
修改后的完整代码
class Split_recycler_adapter(var arrayList: ArrayList<Split_recycler_model>) : RecyclerView.Adapter<Split_recycler_adapter.Viewholder>() { // 全局维护选中的位置,初始-1表示无选中项,若默认选中第一个可设为0 private var selectedPosition = -1 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Viewholder { val v = LayoutInflater.from(parent.context).inflate(R.layout.changesplit_recycler_item, parent, false) return Viewholder(v) } override fun onBindViewHolder(holder: Viewholder, position: Int) { val split_modal = arrayList[position] holder.split_text.text = split_modal.getText() // 根据全局选中状态设置当前Item的样式 if (position == selectedPosition) { holder.split_text.setBackgroundResource(R.drawable.green_button_gradient) holder.split_text.setTextColor(Color.parseColor("#454546")) } else { holder.split_text.setBackgroundResource(R.drawable.dropdown_gradient) holder.split_text.setTextColor(Color.parseColor("#A4A4A4")) } holder.split_text.setOnClickListener { // 可选:点击已选中项时取消选中 if (selectedPosition == position) { selectedPosition = -1 } else { selectedPosition = position } // 刷新列表,让所有Item同步更新样式 notifyDataSetChanged() } } override fun getItemCount(): Int { return arrayList.size } class Viewholder(Itemview: View) : RecyclerView.ViewHolder(Itemview) { val split_text: TextView = Itemview.findViewById(R.id.split_text) } }
关键改动说明
- 全局选中状态管理:新增
selectedPosition变量统一记录当前选中的Item位置,避免每个Item独立维护状态导致的不同步问题。 - 绑定阶段动态设置样式:在
onBindViewHolder中根据selectedPosition判断当前Item是否选中,直接设置对应样式,确保每次Item重新绑定(如滚动复用)时状态正确。 - 点击事件更新状态并刷新:点击Item时更新
selectedPosition,调用notifyDataSetChanged()触发列表刷新,让所有Item同步更新样式。 - 可选取消选中逻辑:如果需要支持点击已选中项取消选中,保留
if (selectedPosition == position)的判断逻辑,否则直接设置selectedPosition = position即可。
内容的提问来源于stack exchange,提问作者Gowshik
相关产品推荐
相关产品推荐

