【问题标题】:Can't figure out why background color has an erratic behavior when scrolling ListView无法弄清楚为什么滚动 ListView 时背景颜色的行为不稳定
【发布时间】:2011-11-20 20:05:12
【问题描述】:

我认为这个问题值得一读,在我看来……我试图详细解释,但为了方便您阅读而进行了抽象。

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

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

别担心 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 和 GREY,滚动列表不会使列表颜色变得疯狂。颜色没有变化,一切似乎都很好。除了,当然,我不想要 DKGRAY 和 GREY,我想要 DKGRAY,别管其他孩子。 ¬¬

请帮帮我!


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

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

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

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

【问题讨论】:

  • 我怀疑这个whooooole问题可能非常简单。但是当你想不通的时候你就想不通......

标签: android listview layout colors android-cursoradapter


【解决方案1】:

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

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

【讨论】:

  • 大多数布局的默认值为空。如果您想将一行切换为透明,请尝试setBackgroundDrawable(null)
  • 谢谢你们!我只需要那个,我知道我不能依赖默认值并且它确实是预期的。
猜你喜欢
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多