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)
希望这可以帮助.
小智 11
尝试
f_listView.getChildAt(positionOfChildYouWantGet - f_listView.getFirstVisiblePosition());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52183 次 |
| 最近记录: |