15

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

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

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

4 回答 4

9

我找到了让它工作的方法。我需要检查孩子对 ScrollView 的测量高度,在本例中为 LinearLayout。我使用 <= 因为它也应该在不需要滚动时做一些事情。即当LinearLayout 不如ScrollView 高时。在这些情况下,getScrollY 始终为 0。

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
    }
于 2010-05-19T14:09:49.660 回答
5

这里是:

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) {}
于 2013-07-25T14:02:37.490 回答
1

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

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

将垂直滚动视图的 getWidth() 更改为 getHeight()

于 2013-03-26T20:19:32.663 回答
0

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

于 2010-05-19T12:15:28.973 回答