Android:检测ListView是否有滚动条(设置新数据后)

时间:2013-12-08 07:00:52

标签: android android-listview scrollbar android-arrayadapter notifydatasetchanged

我有一个链接到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是否包含滚动条?

谢谢你的帮助!

2 个答案:

答案 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()告诉它。