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

RecyclerView选中项背景色切换异常:选中第1项时第7项同步变色求助

解决RecyclerView点击item颜色串位的问题

嘿,这个问题我太熟了——这完全是RecyclerView的ViewHolder复用机制在搞鬼!你遇到的第1项和第7项一起变色的情况,本质是因为RecyclerView会把滑出屏幕的ViewHolder回收,再给新进入屏幕的item复用。如果没给每个item的选中状态做持久化保存,复用的ViewHolder就会带着之前的UI状态“上岗”,导致看起来像是无关item也被选中了。

下面给你一步步的解决办法:

1. 给数据模型添加选中状态字段

首先,你需要在每个item对应的数据类里加一个布尔字段,用来记录这个item是否被选中。比如假设你的数据类是这样的:

public class YourItemModel
{
    // 你原本的字段,比如要显示的文本
    public string DisplayText { get; set; }
    // 新增:记录选中状态,默认未选中
    public bool IsSelected { get; set; } = false;
}

2. 在Adapter的绑定方法里根据状态更新UI

接下来,关键的一步:在OnBindViewHolder方法里,必须根据当前item的选中状态来设置UI,而不是只在点击时临时修改。这样每次ViewHolder被复用的时候,都会重新绑定当前item的状态,不会带着旧状态乱跑。

public override void OnBindViewHolder(YourViewHolder holder, int position)
{
    var currentItem = _itemList[position];
    
    // 设置文本内容
    holder.YourTextView.Text = currentItem.DisplayText;

    // 根据选中状态设置背景色和文字色
    if (currentItem.IsSelected)
    {
        // 选中时的样式
        holder.YourLinearLayout.SetBackgroundColor(Color.ParseColor("#2196F3"));
        holder.YourTextView.SetTextColor(Color.White);
    }
    else
    {
        // 默认样式
        holder.YourLinearLayout.SetBackgroundColor(Color.White);
        holder.YourTextView.SetTextColor(Color.Black);
    }

    // 处理点击事件
    holder.ItemView.Click += (sender, e) =>
    {
        // 切换当前item的选中状态
        currentItem.IsSelected = !currentItem.IsSelected;
        // 只刷新当前item,避免全局刷新影响性能
        NotifyItemChanged(position);
    };
}

3. (可选)如果需要单选功能

如果你要实现“只能选中一个item”的效果,点击新item时要先取消之前选中的item状态:

// 先在Adapter里记录之前选中的位置
private int _selectedPosition = -1;

// 点击事件里修改成:
holder.ItemView.Click += (sender, e) =>
{
    if (_selectedPosition != -1)
    {
        // 取消之前选中的item状态
        _itemList[_selectedPosition].IsSelected = false;
        NotifyItemChanged(_selectedPosition);
    }
    // 设置当前item为选中状态
    currentItem.IsSelected = true;
    _selectedPosition = position;
    NotifyItemChanged(position);
};

为什么之前的写法会出问题?

你之前应该是直接在点击事件里修改了ViewHolder的UI,但没有把这个选中状态保存到数据里。当第1项滑出屏幕,它的ViewHolder被回收给第7项使用时,这个ViewHolder的UI还是保持着选中的样式,所以看起来第7项也变色了。现在把状态存在数据模型里,每次绑定都从数据取状态,就彻底解决了复用导致的串位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:08:24