【问题标题】:How do I know that the scrollview is already scrolled to the bottom?我怎么知道滚动视图已经滚动到底部?
【发布时间】:2010-05-19 10:16:31
【问题描述】:

我有一个滚动视图,我只想在它已经滚动到底部时发生一个事件,但我找不到检查滚动视图是否在底部的方法。

我已经解决了相反的问题;仅当事件已滚动到顶部时才允许发生:

ScrollView sv = (ScrollView) findViewById(R.id.Scroll);
    if(sv.getScrollY() == 0) {
        //do something
    }
    else {
        //do nothing
    }

【问题讨论】:

    标签: android scrollview


    【解决方案1】:

    我找到了让它工作的方法。我需要检查孩子对 ScrollView 的测量高度,在本例中是 LinearLayout。我使用

    ScrollView scrollView = (ScrollView) findViewById(R.id.ScrollView);
        LinearLayout linearLayout = (LinearLayout) findViewById(R.id.LinearLayout);
        if(linearLayout.getMeasuredHeight() <= scrollView.getScrollY() +
               scrollView.getHeight()) {
            //do something
        }
        else {
            //do nothing
        }
    

    【讨论】:

    • 因为 ScrollView 只能有一个孩子,你确定有一个: if (scrollView.getScrollY() + scrollView.getHeight() >= scrollView.getChildAt(0).getMeasuredHeight() ) { /* 已经滚动到底部 */ }
    • 这是放在方法中的吗?这段代码是如何实现的?
    • @ItzHoudini 我把它做得尽可能通用,这样你就可以随心所欲地使用它。
    【解决方案2】:

    这里是:

    public class myScrollView extends ScrollView
    {
        public myScrollView(Context context)
        {
            super(context);
        }
        public myScrollView(Context context, AttributeSet attributeSet)
        {
            super(context,attributeSet);
        }
    
        @Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt)
        {
            View view = (View)getChildAt(getChildCount()-1);
            int d = view.getBottom();
            d -= (getHeight()+getScrollY());
            if(d==0)
            {
                //you are at the end of the list in scrollview 
                //do what you wanna do here
            }
            else
                super.onScrollChanged(l,t,oldl,oldt);
        }
    }
    

    您可以在 xml 布局中使用 myScrollView 或在您的代码中实例化它。 提示:使用上面的代码,如果用户频繁点击列表末尾 10 次,那么您的代码将运行 10 次。在某些情况下,例如当您想从远程服务器加载数据以更新您的列表时,这种行为将是不受欢迎的(很可能)。尝试预测不良情况并避免它们。

    提示 2:有时接近列表末尾可能是让脚本运行的正确时机。例如,用户正在阅读文章列表并且接近尾声。然后你在列表完成之前开始加载更多。为此,只需执行以下操作即可实现您的目的:

    if(d<=SOME_THRESHOLD) {}
    

    【讨论】:

      【解决方案3】:

      你可以通过这样做获得最大滚动宽度

      int maxScroll = yourScrollView.getChildAt(0).getMeasuredWidth() - yourScrollView.getWidth();
      

      将 getWidth() 更改为 getHeight() 以获得垂直滚动视图

      【讨论】:

        【解决方案4】:

        如果 scrollView.getHeight() == scrollView.getScrollY + screensize,则滚动到底部。

        【讨论】:

        • 谢谢,但是当滚动在底部时 getScrollY = 349 getBottom = 430 getMeasuredHeight = 430 getHeight = 430 无论我向下滚动多远,最后三个都是相同的。唯一不同的是getScrollY。你提到的这个屏幕尺寸是多少?我是否误操作了它?在这种情况下应该是 81,我想不出有什么。
        猜你喜欢
        • 2020-09-15
        • 1970-01-01
        • 2014-07-11
        • 2016-10-08
        • 2017-06-26
        • 2011-08-31
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        相关资源
        最近更新 更多