ListView getChildAt为可见子项返回null

Chr*_*ris 67 null android listview

我从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));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

应该注意的是,正确报告了第一个和最后一个可见索引,因为我在运行它时正在查看第3-8行.第6,7,8行正确呈现.如果它们为空,它们如何显示?

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

关于为什么将这些行返回为null的任何信息都将非常感激.

谢谢!

C N*_*ick 135

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++) 
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 啊哈!谢谢.如果文档明确指出getChildAt(i)使用VISIBLE位置而不是逻辑位置,那将非常有用.本来可以节省很多头发. (65认同)
  • 确切地说,这在文档中没有描述.@CNick:对此的任何引用? (3认同)

小智 11

尝试

f_listView.getChildAt(positionOfChildYouWantGet - f_listView.getFirstVisiblePosition());
Run Code Online (Sandbox Code Playgroud)