我有一个链接到ListView的ArrayAdapter。
mListView.setAdapter(mArrayAdapter);
每当我将ArrayList数据重置为ArrayAdapter时:
mArrayAdapter.clear();
mArrayAdapter.addAll(mArrayList);
mArrayAdapter.notifyDataSetChanged()
ListView获得正确更新
但是,如果刚好在上面的三行之后,我调用自定义方法mListView.hasScrollbar()
来检测列表视图是否有滚动条,我得到一个空lastVisibleItem
:
public boolean hasScrollbar() {
View lastVisibleItem = (View) getChildAt(getChildCount() - 1);
if (lastVisibleItem.getBottom()>=getHeight()) {
return true;
}
return false;
}
这是否意味着列表视图仍在刷新?
我的主要问题是:
如何在使用新数据重置适配器后测试listview是否包含滚动条?
谢谢你的帮助!
答案 0 :(得分:2)
使用getLastVisiblePosition / getFirstVisiblePosition是一种有效的方法,用于检测列表视图中是否滚动(只要将其与getCount()进行比较并进行数学运算)。 您已经猜到的问题是您试图检查不同步。 为了在适配器已填充列表数据和更新更改时同步查询,您需要向列表发出一个发布请求,该请求将该请求堆叠到适配器的消息队列中。
yourAdapter.notifyDataSetChanged();
yourAdapter.getListView().post(new Runnable() {
@Override public void run() {
//your code here
}
});
确保在notifySetDataChanged()
之后调用它。因为您希望在检查之前更新列表。
答案 1 :(得分:0)
我认为您的问题等于“如何判断列表视图是否包含需要在多个屏幕上显示的项目”?
所以我的建议是使用listView.getFirstVisiblePosition()和getLastVisiblePosition()告诉它。