安卓:ListView.getScrollY() - 它有效吗?

27

我在使用它,但是它总是返回0,即使我已经滚动到列表的末尾。


1
如果你想知道用户向下滚动时列表顶部消失的像素数量,请查看我的答案 - Maria
请查看以下链接获取正确的解决方案:https://dev59.com/w2cs5IYBdhLWcg3wlFA2#35594825 - Sarasranglt
3个回答

34

getScrollY()实际上是View的一个方法,而不是ListView的方法。它指的是整个视图滚动的距离,因此它几乎始终为0。

如果您想知道ListView内容滚动了多远,可以使用listView.getFirstVisiblePosition()方法。


9
请注意,getFirstVisiblePosition将返回而不是位置,因此除非所有列表项的高度完全相同,在使用它作为getScrollY的替代方法时,它并不可行。 - user153275
滚动视图的getScroolY位置是在视口顶部还是底部? - Vlado Pandžić

4
它是有效的,它返回视图中已滚动部分的顶部相对于可见视图顶部的像素值。请参阅getScrollY()文档。基本上,如果您的列表占据整个视图,则始终会得到0,因为列表的已滚动部分的顶部始终位于屏幕顶部。

要查看是否到达列表末尾,您需要执行以下操作:

public void onCreate(final Bundle bundle) {
     super.onCreate(bundle);
     setContentView(R.layout.main);
     // The list defined as field elswhere
     this.view = (ListView) findViewById(R.id.searchResults);
     this.view.setOnScrollListener(new OnScrollListener() {
          private int priorFirst = -1;
          @Override
          public void onScroll(final AbsListView view, final int first, final int visible, final int total) {
               // detect if last item is visible
               if (visible < total && (first + visible == total)) {
                    // see if we have more results
                    if (first != priorFirst) {
                         priorFirst = first;
                         //Do stuff here, last item is displayed, end of list reached
                    }
               }
          }
     });
}

priorFirst计数器的原因是有时会生成多次滚动事件,因此您只需要对第一次到达列表末尾做出反应。

如果您正在尝试创建自动增长列表,我建议使用这个教程


1
您需要两个东西来精确定义listView的滚动位置:
要获取当前位置:
int firstVisiblePosition = listView.getFirstVisiblePosition(); 
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.

设置位置:

listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo.. 
listView.scrollTo(0,-topEdge);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接