4

我有一个链接到 ListView 的 ArrayAdapter。

mListView.setAdapter(mArrayAdapter);

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

mArrayAdapter.clear();
mArrayAdapter.addAll(mArrayList);
mArrayAdapter.notifyDataSetChanged()

ListView 得到正确更新

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

public boolean hasScrollbar() {
    View lastVisibleItem = (View) getChildAt(getChildCount() - 1);
    if (lastVisibleItem.getBottom()>=getHeight()) {
        return true;
    }
    return false;
}

这是否意味着列表视图仍然令人耳目一新?

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

感谢您的任何帮助!

4

2 回答 2

2

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

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

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

于 2013-12-08T07:41:53.000 回答
0

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

所以我的建议是使用 listView.getFirstVisiblePosition() 和 getLastVisiblePosition() 来告诉它。

于 2013-12-08T07:11:45.860 回答