我认为这个问题值得一读,在我看来......我试图详细解释,但是为了减轻你的阅读而抽象出来。
我有ListView
填充了自定义CursorAdapter
。
在bindView()
方法中,我尝试设置孩子的颜色。
此子项为LinearLayout
,是用于列表中项目的根布局。它位于XML文件R.layout.list_item
中,在自定义CursorAdapter的newView()
方法中膨胀。
我使用下面的代码设置背景颜色。
LinearLayout root = (LinearLayout) view.findViewById(R.id.list_item_root);
// ...
if (isEvenDay(cal)) {
tvDate.setText(tvDate.getText() + " *");
root.setBackgroundColor(Color.DKGRAY);
}
不要担心if块中除setBackgroundColor
以外的任何内容 。你会看到。
预期的行为:有些孩子会被绘制DKGRAY
,并且*会附加到某个textView。其他将是默认颜色,没有这个*。我使用这个*标签只是为了确保它不是(直接)我的代码。
行为:最初显示ListView时,看起来没问题。当我滚动列表时,它会变得“怪异”(我不明白),有些孩子会开始改变颜色,直到所有孩子都被画成DKGRAY
。
现在,情况最糟糕的是:
LinearLayout root = (LinearLayout) view.findViewById(R.id.list_item_root);
// ...
if (isEvenDay(cal)) {
tvDate.setText(tvDate.getText() + " *");
root.setBackgroundColor(Color.DKGRAY);
} else {
root.setBackgroundColor(Color.GRAY);
}
正确的孩子画DKGRAY和灰色,滚动列表不会使列表颜色变得疯狂。颜色不会改变,一切似乎都没问题。当然,除了我不想DKGRAY和灰色,我想要DKGRAY并让其他孩子独自一人。 ¬¬
请帮助我!
下面的图片。看看第一列中的*如何在不同日期之间正常工作,但颜色没有。
1-我开始滚动,有些孩子已经有缺陷了:
2-我完成了上下滚动,最后所有孩子都有缺陷:
3-但是当我为所有孩子设置颜色时,滚动不会搞砸它:
答案 0 :(得分:2)
为了不创建大量的内存中视图并导致大量的分配和垃圾收集,bindView将为您提供滚动大型列表时已经使用的“循环”视图。此视图将具有上次使用时发生的任何属性。因此,您需要明确设置所有这些属性。
所以,如果有时你想要它是灰色的,有时你想要它是白色的,你需要始终将它设置为一个或另一个。没有“默认”可以依赖。