如何确定ListView是否已滚动到顶部大多数位置?

Shi*_*own 29 android

我有一个ListView,首先它向下滚动,现在当我们向上滚动时,它达到最高点.我想检测一下.有什么办法吗?我正在用api级别开发应用程序8.Pls帮助..

Gra*_*eme 41

编辑

请参阅下面的评论,为什么,特别是在不同的API版本(尤其是后来的版本)上,这不是一个简单的方法,看看你的列表是否在顶部(填充等).但是,它确实为您在API 14以下的设备上提供解决方案的开始:

private boolean listIsAtTop()   {   
    if(listView.getChildCount() == 0) return true;
    return listView.getChildAt(0).getTop() == 0;
}
Run Code Online (Sandbox Code Playgroud)

就我多年前的实施情况而言 - 这在当时完美无缺.

  • 当我在列表的顶部时,这并不总是返回0 (5认同)
  • 这对我来说真的不起作用,而滚动它会随机为0索引子的getTop返回0,即使列表不在顶部 (2认同)

top*_*duo 21

我知道这个问题很老,但它在Google搜索结果中显示出来.API级别14中引入了一种新方法,可以提供我们所需的内容:

http://developer.android.com/reference/android/view/View.html#canScrollVertically%28int%29

对于较旧的平台,可以使用ViewCompatv4支持库中的类似静态方法.见下面的编辑.

与Graeme的方法不同,此方法不受内部视图重用ListView和/或标头偏移引起的问题的影响.

编辑:最终解决方案

我在SwipeRefreshLayout的源代码中找到了一个方法来处理这个问题.它可以改写为:

public boolean canScrollUp(View view) {
  if (android.os.Build.VERSION.SDK_INT < 14) {
    if (view instanceof AbsListView) {
      final AbsListView absListView = (AbsListView) view;
      return absListView.getChildCount() > 0
          && (absListView.getFirstVisiblePosition() > 0 || absListView
              .getChildAt(0).getTop() < absListView.getPaddingTop());
    } else {
      return view.getScrollY() > 0;
    }
  } else {
    return ViewCompat.canScrollVertically(view, -1);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果传入视图是自定义视图,则可能需要添加自定义逻辑.


Tim*_*win 12

我的朋友们,将Graeme的回答与onScroll方法相结合......

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        if(firstVisibleItem == 0 && listIsAtTop()){
            swipeRefreshLayout.setEnabled(true);
        }else{
            swipeRefreshLayout.setEnabled(false);
        }
    }
});


private boolean listIsAtTop()   {
    if(listView.getChildCount() == 0) return true;
    return listView.getChildAt(0).getTop() == 0;
}
Run Code Online (Sandbox Code Playgroud)