Android Studio(Kotlin)中RecyclerView滚动变色:为何if语句需加else?
RecyclerView滚动时颜色丢失的原因及解决
这问题核心是RecyclerView的ViewHolder复用机制在搞鬼:
RecyclerView不会为每个item都创建新的ViewHolder,当item滑出屏幕,它的ViewHolder会被回收,用来展示新滑入屏幕的item。你的初始代码只在status<=2时给item设置深色,但如果复用的ViewHolder之前绑定的是status<=2的item(已经被改成深色),现在新绑定的是status>2的item,代码里没做任何处理,这个ViewHolder就会带着之前的深色显示,不会自动恢复xml里默认的绿色,这就是你看到的“颜色丢失”。
初始代码:
if(dataSet[position].status<=2) { //The default color (R.color.green) is set in xml val color = ContextCompat.getColor(context, R.color.primaryDarkColorInactive) viewHolder.item.setBackgroundColor(color) }
修正后的代码之所以能解决问题,是因为它不管条件是否满足,都会明确设置对应的颜色:
val colorRes = if (dataSet[position].status <= 2) { R.color.primaryDarkColorInactive } else { R.color.green } val color = ContextCompat.getColor(context, colorRes) viewHolder.item.setBackgroundColor(color)
这样复用ViewHolder时,新的颜色会完全覆盖之前的状态,不会有旧颜色残留。
内容的提问来源于stack exchange,提问作者FerNet
相关产品推荐
相关产品推荐

