【问题标题】: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还在刷新?

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

感谢您的帮助!

【问题讨论】:

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


    【解决方案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,最后一个可见位置是适配器的最后一个索引?如果这是真的,但两个项目之一不完全可见怎么办?在这种情况下,滚动条仍然会出现。
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多