滚动ListView时无法弄清楚为什么背景颜色具有不稳定的行为

时间:2011-11-20 20:05:12

标签: android listview layout colors android-cursoradapter

我认为这个问题值得一读,在我看来......我试图详细解释,但是为了减轻你的阅读而抽象出来。

  1. 我有ListView填充了自定义CursorAdapter

  2. bindView()方法中,我尝试设置孩子的颜色。

  3. 此子项为LinearLayout,是用于列表中项目的根布局。它位于XML文件R.layout.list_item中,在自定义CursorAdapter的newView()方法中膨胀。

  4. 我使用下面的代码设置背景颜色。

    LinearLayout root = (LinearLayout) view.findViewById(R.id.list_item_root);
    // ...
    if (isEvenDay(cal)) {
        tvDate.setText(tvDate.getText() + " *");
        root.setBackgroundColor(Color.DKGRAY);
    }
    
  5. 不要担心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-我开始滚动,有些孩子已经有缺陷了:

    enter image description here

    2-我完成了上下滚动,最后所有孩子都有缺陷:

    enter image description here

    3-但是当我为所有孩子设置颜色时,滚动不会搞砸它:

    enter image description here

1 个答案:

答案 0 :(得分:2)

为了不创建大量的内存中视图并导致大量的分配和垃圾收集,bindView将为您提供滚动大型列表时已经使用的“循环”视图。此视图将具有上次使用时发生的任何属性。因此,您需要明确设置所有这些属性。

所以,如果有时你想要它是灰色的,有时你想要它是白色的,你需要始终将它设置为一个或另一个。没有“默认”可以依赖。