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

RecyclerView中LinearLayout随位置切换背景异常问题求助

问题分析与解决方案

兄弟,你的问题根源其实是RecyclerView的ViewHolder复用机制在搞鬼!当你滚动列表时,已经滑出屏幕的ViewHolder会被回收复用给新的位置,但你只给偶数位置设置了灰色背景,却没管奇数位置的背景重置,导致复用的ViewHolder带着旧的背景色跑到新位置,就出现了随机异常的情况。

修复后的代码

只需要在onBindViewHolder里补上else分支,给奇数位置的LinearLayout设置默认背景色就行:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
    ViewHolder holder = (ViewHolder) viewHolder;
    String mes = mesesList.get(position);
    holder.meses.setText(mes);
    
    if (position % 2 == 0) {
        holder.linearLayout.setBackgroundColor(Color.GRAY);
    } else {
        // 这里换成你需要的默认背景色,比如白色
        holder.linearLayout.setBackgroundColor(Color.WHITE);
    }
}

为啥这样就能解决?

RecyclerView不会每次都新建ViewHolder,滚动时回收旧ViewHolder再绑定新数据是它的核心优化点。如果你的绑定逻辑只处理了“偶数位置设灰色”这一种情况,没处理“奇数位置恢复默认”的反向逻辑,那被复用的ViewHolder就会带着之前的灰色背景出现在奇数位置,自然就乱了。

另外给个小建议:把颜色值放到res/values/colors.xml里管理会更方便维护,比如:

<!-- res/values/colors.xml -->
<color name="list_even_bg">#808080</color>
<color name="list_odd_bg">#FFFFFF</color>

然后代码里这样引用:

holder.linearLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.list_even_bg));

内容的提问来源于stack exchange,提问作者Vânia Almeida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:31:55