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

RecyclerView点击Item切换选中项背景色实现方法咨询

这问题我之前做列表功能的时候经常碰到,核心思路就是跟踪当前选中的Item位置,然后在绑定每个Item的时候根据这个标记切换背景就行,给你分享两种实用的实现方式:

方法一:在RecyclerView Adapter中直接维护选中状态

这是最直观的方案,适合简单的列表场景:

  1. 首先在Adapter里定义一个变量,用来记录当前选中的Item位置:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private int selectedPosition = -1; // -1表示初始无选中项
    // 其他变量、构造函数...
}
  1. 给Item准备两种背景状态:
    • 推荐用Android的状态选择器(Selector Drawable),创建drawable/item_background_selector.xml:
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@color/selected_color" android:state_selected="true"/>
        <item android:drawable="@color/normal_color"/>
    </selector>
    
    然后给Item布局的根View设置android:background="@drawable/item_background_selector"。
  2. 在onBindViewHolder中根据选中状态更新UI,并设置点击事件:
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    // 绑定你的业务数据...
    
    // 设置选中状态
    holder.itemView.setSelected(selectedPosition == position);
    
    // 处理Item点击
    holder.itemView.setOnClickListener(v -> {
        // 如果点击的是已选中的Item,直接返回
        if (selectedPosition == position) return;
        
        // 记录之前的选中位置,刷新它
        int oldSelectedPos = selectedPosition;
        // 更新当前选中位置
        selectedPosition = position;
        
        // 只刷新需要变化的两个Item,比notifyDataSetChanged性能更好
        notifyItemChanged(oldSelectedPos);
        notifyItemChanged(selectedPosition);
    });
}

方法二:结合ViewModel管理选中状态(适合MVVM架构)

如果你的项目用了MVVM架构,把选中状态放到ViewModel中维护会更符合解耦的设计原则:

  1. 在ViewModel中定义LiveData来保存选中位置:
class MyListViewModel : ViewModel() {
    private val _selectedItemPos = MutableLiveData<Int>(-1)
    val selectedItemPos: LiveData<Int> = _selectedItemPos

    fun updateSelectedPos(pos: Int) {
        _selectedItemPos.value = pos
    }
}
  1. 在Activity/Fragment中观察LiveData的变化,通知Adapter更新:
// 初始化Adapter和ViewModel后
viewModel.selectedItemPos.observe(this, newSelectedPos -> {
    int oldPos = adapter.getSelectedPosition();
    adapter.setSelectedPosition(newSelectedPos);
    adapter.notifyItemChanged(oldPos);
    adapter.notifyItemChanged(newSelectedPos);
});
  1. Adapter中的点击事件改为通知ViewModel更新状态:
holder.itemView.setOnClickListener(v -> {
    viewModel.updateSelectedPos(position);
});

几个注意点:

  • 用notifyItemChanged而非notifyDataSetChanged:只刷新需要变化的Item,避免整个列表重绘,提升性能。
  • 解决复用问题:RecyclerView的Item复用不会影响状态,因为onBindViewHolder每次绑定都会重新检查选中状态并更新UI。
  • 默认选中:如果需要默认选中某个Item,只需在Adapter初始化时给selectedPosition赋值对应位置,再调用notifyItemChanged(selectedPosition)即可。

内容的提问来源于stack exchange,提问作者khateeb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:08:06