【问题标题】:How to know if the user has scrolled to the top or bottom of a listview/scrollview如何知道用户是否滚动到列表视图/滚动视图的顶部或底部
【发布时间】:2014-07-11 12:26:06
【问题描述】:

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

现在我正在使用 OnScrollListener 来了解哪些列表视图项是可见的。

    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
            }
        }
    });

【问题讨论】:

  • 好的,那为什么你的解决方案没有成功呢?什么不工作?
  • 因为它没有告诉我当用户滚动到列表的顶部或底部并且他无法进一步滚动时我需要知道什么。

标签: android


【解决方案1】:

我通过检查第一个或最后一个项目的偏移量找到了解决方案,当这些项目的偏移量为 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;
                }
            }               
        }
    });

【讨论】:

  • 此代码段无法检测ListView是否到达底部。请重新编辑。
  • 在第二块写:“//到达底部:”。
【解决方案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

                }
        }
    }); 

【讨论】:

【解决方案3】:

滚动列表视图时调用适配器getView方法

当您的位置等于数据大小列表视图时检查位置,以便您位于列表的最后一个元素

【讨论】:

  • 不完全是,getview 在视图变得可见时调用,而不是在它到达列表的顶部/底部时调用。
【解决方案4】:
@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
}
}

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多