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

Posted

技术标签:

【中文标题】Android:检测 ListView 是不是有滚动条(设置新数据后)【英文标题】:Android: Detect if a ListView has the scrollbar (after setting new data)Android:检测 ListView 是否有滚动条(设置新数据后) 【发布时间】:2013-12-25 09:21:49 【问题描述】:

我有一个链接到 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还在刷新?

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

感谢您的帮助!

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

您能否更具体地了解一下使用 getLastVisiblePosition / getFirstVisiblePosition 检测滚动条的情况?谢谢!!! 我认为这些方法返回在您执行该方法时在屏幕上可见的 listview 元素的 int 位置。如果我没记错的话,你可以使用这些值和 lv.getCount() 所以如果第一个/最后一个可见位置 我找不到简单的方法来确定内容是否在滚动,仅使用第一个和最后一个位置。例如,如果适配器有 5 个元素,并且第一个可见位置是 0,最后一个可见位置是 4,则仍然可能是最后一个视图的第一个不完全可见,因此会有一个滚动条。 【参考方案2】:

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

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

【讨论】:

你到底测试什么?如果第一个可见位置是 0,最后一个可见位置是适配器的最后一个索引?如果这是真的,但两个项目之一不完全可见怎么办?在这种情况下,滚动条仍然会出现。

以上是关于Android:检测 ListView 是不是有滚动条(设置新数据后)的主要内容,如果未能解决你的问题,请参考以下文章

检测哪个选定项目(在 ListView 多列中)产生了 ContextMenu (Android)

检测ListView中的TextView是不是为椭圆

如何检测用户是不是开始垂直滚动 Listview.builder?

android listview每个Item放置多个图片

Android中view怎么刷新(不是listView)

RecyclerView的使用(Android开发必备,替换掉ListView)