2010-05-19 128 views
14

我有一个滚动视图,我只想要一个事件发生,如果它已经滚动到底部,但我无法找到一种方法来检查滚动视图是否在底部。我如何知道滚动视图已经滚动到底部?

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

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

回答

8

我找到了一种使它工作的方法。我需要检查孩子测量到的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 
    } 
+2

由于滚动型只能有一个孩子,在那里你一定有一个: 如果(scrollView.getScrollY()+ scrollView.getHeight()> = scrollView.getChildAt(0).getMeasuredHeight()){/ *已滚动到底* /} – Tom 2015-01-14 22:07:17

+0

这是放在一个方法?这个代码是如何实现的? – 2015-02-09 02:04:57

+0

@ItzHoudini我尽可能通用,所以你可以任何你想要的方式使用它。 – sanna 2015-02-11 14:17:11

0

如果scrollView.getHeight()== scrollView.getScrollY +屏幕尺寸,则滚动至底部。

+1

谢谢你,但是当滚动处于底部 getScrollY = 349 getBottom = 430 getMeasuredHeight = 430 的getHeight = 430 的最后三个无论我滚动多远,都一样。 唯一不同的是getScrollY。 你提到的这个screenize是什么?我错过了交互操作吗?在这种情况下应该是81,我想不出任何这样的事情。 – sanna 2010-05-19 12:55:58

1

你可以这样做

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

对于垂直滚动视图

5

变化的getWidth()来的getHeight()获取宽度最大滚动它是:

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

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

提示2:有时会越来越接近列表的末尾可能是让你的脚本运行在正确的时间。例如,用户正在阅读文章列表并越来越接近结束。那么你在列表完成之前开始加载更多。要做到这一点,仅仅这样做是为了实现你的目的:

if(d<=SOME_THRESHOLD) {} 
+0

谢谢:D,我为这个headcache玩得很开心 – rkmax 2014-09-21 16:45:22