为了账号安全,请及时绑定邮箱和手机立即绑定

ListView getChildAt返回可见孩子的null

ListView getChildAt返回可见孩子的null

摇曳的蔷薇 2019-10-17 16:07:05
我从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: 3D/...: Last visible index: 8D/...: 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 nullD/...: Child at index 7 is nullD/...: Child at index 8 is null应当注意,正确地报告了第一个和最后一个可见索引,因为我在运行此行时正在查看第3-8行。第6、7、8行的渲染正确。如果它们为null,如何显示?另外,我不知道这是否重要,但是当我位于列表视图的顶部时,第5行是最后可见的行。关于为什么将这些行返回为null的任何信息,将不胜感激。谢谢!
查看完整描述

3 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

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++) 

希望这可以帮助。


查看完整回答
反对 回复 2019-10-17
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

尝试


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


查看完整回答
反对 回复 2019-10-17
?
慕的地10843

TA贡献1785条经验 获得超8个赞

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

查看完整回答
反对 回复 2019-10-17
  • 3 回答
  • 0 关注
  • 450 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信