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

Android:检测ListView是否有滚动条(设置新数据后),android,android-listview,scrollbar,android-arrayadapter,notifydatasetchanged,Android,Android Listview,Scrollbar,Android Arrayadapter,Notifydatasetchanged,我有一个链接到列表视图的ArrayAdapter mListView.setAdapter(mArrayAdapter) 每当我将ArrayList数据重置为ArrayAdapter时: mArrayAdapter.clear(); mArrayAdapter.addAll(mArrayList); mArrayAdapter.notifyDataSetChanged() ListView得到正确更新 但是,如果就在上述三行之后,我调用我的自定义方法mListView.hasScrollbar

我有一个链接到列表视图的ArrayAdapter

mListView.setAdapter(mArrayAdapter)

每当我将ArrayList数据重置为ArrayAdapter时:

mArrayAdapter.clear();
mArrayAdapter.addAll(mArrayList);
mArrayAdapter.notifyDataSetChanged()
ListView得到正确更新

但是,如果就在上述三行之后,我调用我的自定义方法
mListView.hasScrollbar()
来检测listview是否有滚动条,我会得到一个null
lastVisibleItem

public boolean hasScrollbar() {
    View lastVisibleItem = (View) getChildAt(getChildCount() - 1);
    if (lastVisibleItem.getBottom()>=getHeight()) {
        return true;
    }
    return false;
}
这是否意味着listview仍在刷新

我的主要问题是:
在使用新数据重置适配器后,如何测试listview是否具有滚动条?


谢谢你的帮助

我认为您的问题相当于“如何判断列表视图是否包含需要在多个屏幕上显示的项目”


因此,我的建议是使用listView.getFirstVisiblePosition()和getLastVisiblePosition()来告诉它。

使用getLastVisiblePosition/getFirstVisiblePosition是检测列表视图中是否有滚动的有效方法(只要将其与getCount()进行比较并计算)。 您已经猜到的问题是,您正在尝试签出不同步。 为了在适配器已填充列表数据并更新更改时同步查询,您需要向列表发出post请求,该请求将堆叠到适配器的消息队列中

yourAdapter.notifyDataSetChanged();
yourAdapter.getListView().post(new Runnable() { 
    @Override public void run() { 
        //your code here        
    } 
});

当然,请确保在
notifySetDataChanged()之后调用该函数。因为您希望在检查之前更新列表。

您到底测试了什么?如果第一个可见位置是0,最后一个可见位置是适配器的最后一个索引?如果这是真的,但两项中的一项不完全可见,那该怎么办?在这种情况下,滚动条仍然会出现。您能否更具体地使用getLastVisiblePosition/getFirstVisiblePosition检测滚动条?谢谢我认为这些方法返回listview元素的int位置,该位置在您执行该方法时在屏幕上可见。如果我记得很清楚,您可以使用这些值和lv.getCount()来播放,因此如果第一个/最后一个可见位置