我想根据天气设置不同的网格项背景颜色,该项的模型有一些布尔设置为tru或false。因此,在我onBindViewHolder
的{{1}}方法中,我会检查:
MyRecyclerviewAdapter
加载回收网格视图时,它看起来很好,具有hasWiki == true的项目显示为绿色,而hasWiki == false的项目根本没有着色。但是当我向下滚动并且那些未着色的物品不再显示在屏幕上时,我再次向上滚动,这些应该是未着色的物品现在变为绿色。这一切都搞砸了。
这是我的MyViewHolder:
if (current.hasWiki()) {
holder.linearLayout.setBackgroundColor(0xCCF0FCC0);
}
那么,我该如何解决这些不良行为呢?是否有另一种方法可以根据某些任意标志为recyclerview项目设置不同的颜色?
答案 0 :(得分:1)
改变这个:
if (current.hasWiki()) { holder.linearLayout.setBackgroundColor(0xCCF0FCC0); }
到此:
if (current.hasWiki()) {
holder.linearLayout.setBackgroundColor(0xCCF0FCC0);
} else {
holder.linearLayout.setBackgroundColor(/* default color here */);
}
当您处理RecyclerView
时,了解您的ViewHolder
将回收并重复使用。所以,如果你想要发生某些事情,有时候,"您需要确保在"有时"有时候将状态设置回默认状态。没有发生。
答案 1 :(得分:0)
这是回收视图的本质,甚至是在使用普通列表视图的旧方法时。您遇到的问题是您实际上没有回收视图。回收者视图将传递包含需要回收的旧视图的视图持有者。换句话说,当您滚动时,您将接收先前设置为绿色并且现在需要设置为白色(或您想要的任何颜色)的视图。请注意,如果您之前收到视图xyz
的观看持有者,则下次滚动到该视图时,您将无法保证会收到相同的持有者。它可以是另一个。
您展示的逻辑:
if (current.hasWiki()) {
holder.linearLayout.setBackgroundColor(0xCCF0FCC0);
}
是正确的,但是你要回收的物品怎么样?他们应该有白色背景(或任何其他颜色)?这些都没有设定,但必须是。
if (current.hasWiki()) {
holder.linearLayout.setBackgroundColor(0xCCF0FCC0);
} else {
holder.linearLayout.setBackgroundColor(Color.WHITE);
}
这样可以确保正确回收每个视图的背景。现在,这里所说的背景适用于视图持有者中的任何视图,包括图像 - 必须正确设置a.k.a.再循环 - 这就是它被称为回收者视图的原因。
答案 2 :(得分:0)
您需要在onBindViewHolder()方法中添加else
语句
if (current.hasWiki()) {
holder.linearLayout.setBackgroundColor(0xCCF0FCC0);
} else{
holder.linearLayout.setBackgroundColor(Color.TRANSPARENT);
}