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

