如何知道用户是否滚动到列表视图/滚动视图的顶部或底部

时间:2014-05-22 12:48:59

标签: android

我想知道用户何时滚动到列表视图的顶部或底部,他不能再滚动了。

现在我正在使用OnScrollListener来了解哪些listview项目可见。

    listview.setOnScrollListener(new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
            }
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            if (totalItemCount - visibleItemCount == firstVisibleItem) {
                //last item visible
            }

            if (firstVisibleItem == 0) {
                //first item visible
            }
        }
    });

5 个答案:

答案 0 :(得分:10)

我通过检查第一个或最后一个项目的偏移量找到了解决方案,当这些项目的偏移量为0时,我们已经到达listview的底部/顶部。

    listview.setOnScrollListener(new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if (firstVisibleItem == 0) {
                // check if we reached the top or bottom of the list
                View v = listview.getChildAt(0);
                int offset = (v == null) ? 0 : v.getTop();
                if (offset == 0) {
                    // reached the top:
                    return;
                } 
            } else if (totalItemCount - visibleItemCount == firstVisibleItem){
                View v =  listview.getChildAt(totalItemCount-1);
                int offset = (v == null) ? 0 : v.getTop();
                if (offset == 0) {
                    // reached the bottom:
                    return;
                }
            }               
        }
    });

答案 1 :(得分:2)

试试这种方式

 list.setOnScrollListener(new OnScrollListener() {

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {

            }

        int mPosition=0;
        int mOffset=0;

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            // TODO Auto-generated method stub
             int position = list.getFirstVisiblePosition();
               View v = list.getChildAt(0);
                int offset = (v == null) ? 0 : v.getTop();

                if (mPosition < position || (mPosition == position && mOffset < offset)){
                     // Scrolled up 

                } else {
                     // Scrolled down

                }
        }
    }); 

答案 2 :(得分:0)

滚动列表视图时

适配器getView方法调用

当你的位置等于数据大小列表视图时,检查位置,这样你就在列表的最后一个元素

答案 3 :(得分:0)

@Override
public void onScrollChanged()
{

// We take the last son in the scrollview
View view = (View) scrollview.getChildAt(scrollview.getChildCount() - 1);
int diff = (view.getBottom() - (scrollview.getHeight() + scrollview.getScrollY()));
if (diff == 0 )
{
// bottom of the scrollview
}
}

答案 4 :(得分:0)

如果您将自定义适配器与您的  listview,然后使用并享受以下答案:

https://stackoverflow.com/a/55350409/1845404

适配器的getView方法检测列表何时滚动到最后一项。即使适配器已经渲染了最后一个视图之后,在调用某些较早位置的情况下,它也为罕见的情况增加了校正。