在某些网格项上设置不同的颜色

时间:2018-06-11 20:21:51

标签: android android-layout android-recyclerview recyclerview-layout

我想根据天气设置不同的网格项背景颜色,该项的模型有一些布尔设置为tru或false。因此,在我onBindViewHolder的{​​{1}}方法中,我会检查:

MyRecyclerviewAdapter

加载回收网格视图时,它看起来很好,具有hasWiki == true的项目显示为绿色,而hasWiki == false的项目根本没有着色。但是当我向下滚动并且那些未着色的物品不再显示在屏幕上时,我再次向上滚动,这些应该是未着色的物品现在变为绿色。这一切都搞砸了。

这是我的MyViewHolder:

if (current.hasWiki()) {
        holder.linearLayout.setBackgroundColor(0xCCF0FCC0);
    } 

那么,我该如何解决这些不良行为呢?是否有另一种方法可以根据某些任意标志为recyclerview项目设置不同的颜色?

3 个答案:

答案 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);
}