2010-05-19 162 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