1

我认为这个问题值得一读,在我看来......我试图详细解释,但抽象出来以方便您阅读。

  1. 我有一个ListView由自定义填充的CursorAdapter.

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

  3. 这个孩子是一个LinearLayout,用于列表中项目的根布局。它在 XML 文件中,在自定义 CursorAdapterR.layout.list_item的方法中膨胀。newView()

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

    LinearLayout root = (LinearLayout) view.findViewById(R.id.list_item_root);
    // ...
    if (isEvenDay(cal)) {
        tvDate.setText(tvDate.getText() + " *");
        root.setBackgroundColor(Color.DKGRAY);
    }
    

setBackgroundColor除了if 块之外,不要担心任何事情。你会看到的。

预期的行为:一些孩子将被绘制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 和 GREY,滚动列表不会使列表颜色变得疯狂。颜色没有变化,一切似乎都很好。除了,当然,我不想要 DKGRAY 和 GREY,我想要 DKGRAY,别管其他孩子。¬¬

请帮我!


图片如下。查看第一列中的 * 在不同日期之间如何正常工作,但颜色却不行。

1-我开始滚动,一些孩子已经有缺陷:

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

4

1 回答 1

2

为了不创建大量内存视图并导致大量分配和垃圾回收,bindView 将为您提供一个在滚动大列表时已经使用过的“回收”视图。该视图将具有上次使用时碰巧具有的任何属性。因此,您需要显式设置所有这些属性。

因此,如果有时您希望它是灰色的,有时您希望它是白色的,那么您需要始终将其设置为其中一个。没有您可以依赖的“默认值”。

于 2011-11-20T20:12:06.033 回答