ListView getChildAt返回可见孩子的null

我从listview / getChildAt方法得到一些奇怪的行为。


我有一个HashSet,iconsToUpdate,包含数据库中已更改的图标。我想遍历可见行以查看是否需要更新其任何图标以反映新图标。我不需要测试当前不在视图中的图标,因为它们在渲染时会正确绘制。


我的问题是,getChildAt似乎不应该返回null。我知道getChildAt只能返回当前可见的视图,但是对于某些可见行它返回null。


这是我的代码,遍历可见行:


Logger.debug("First visible index: " + f_listView.getFirstVisiblePosition());

Logger.debug("Last visible index: " + f_listView.getLastVisiblePosition());

for (int i = f_listView.getFirstVisiblePosition(); i <= f_listView.getLastVisiblePosition(); i++) {

    String tag = "asdf"; // Remove when bug is fixed.

    if (f_listView == null) {

        Logger.debug("f_listView is null");

    } else if (f_listView.getChildAt(i) == null) {

        Logger.debug("Child at index " + i + " is null");

    } else {

        tag = (String) f_listView.getChildAt(i).getTag();

        Logger.debug("Successful at index " + i + ", tag is: " + tag);

    }

    if (iconsToUpdate.contains(tag)) {

        setIcon(i, f_aim.getInHouseIcon(tag));

    }

}

这是与此循环运行相对应的日志:


D/...: First visible index: 3

D/...: Last visible index: 8

D/...: Successful at index 3, tag is: ...

D/...: Successful at index 4, tag is: ...

D/...: Successful at index 5, tag is: ...

D/...: Child at index 6 is null

D/...: Child at index 7 is null

D/...: Child at index 8 is null

应当注意,正确地报告了第一个和最后一个可见索引,因为我在运行此行时正在查看第3-8行。第6、7、8行的渲染正确。如果它们为null,如何显示?


另外,我不知道这是否重要,但是当我位于列表视图的顶部时,第5行是最后可见的行。


关于为什么将这些行返回为null的任何信息,将不胜感激。


谢谢!


摇曳的蔷薇
浏览 453回答 3
3回答

FFIVE

listView.getChildAt(i)可以在其中0表示最前面的可见行,而(n-1)表示最后一个可见行(其中n是您看到的可见视图数)。get last / first visible返回您在dataAdapter中的位置。因此,由于您从位置3开始,看起来像6个可见视图,所以当位置6-8获得时,您将获得null。在您的示例中,getChildAt(0)将返回位置3。通常,我将位置存储在视图中,以便以后在需要值的情况下在dataAdapter上进行查找。我认为您的for循环应如下所示:for (int i = 0; i <= f_listView.getLastVisiblePosition() - f_listView.getFirstVisiblePosition(); i++)&nbsp;希望这可以帮助。

qq_笑_17

尝试f_listView.getChildAt(positionOfChildYouWantGet - f_listView.getFirstVisiblePosition());

慕的地10843

当您调用listView1.getLastVisiblePosition()和时listView1.getFirstVisiblePosition(),listview返回在列表视图中部分可见的项目的位置。例如,第一项可能是一半可见的,而最后一项可能是一半可见的。在这种情况下,即使您可以在列表视图中看到项目的一部分,适配器也尚未调用getView()该项目的函数,因此该项目仍被视为空。
打开App,查看更多内容
随时随地看视频慕课网APP