2014-07-18 61 views
7

我對這個問題越來越感到瘋狂,從現在4小時開始深入研究,我認爲我不能再聚焦,所以對不起,如果這是一個容易的問題。Android onScrollChanged for Scrollview多次發射

基本上我想跟蹤ScrollY上滾動型(不,我不能使用網格或列表)

我使用ViewTreeObserver與onScrollChanges監聽到它的。但是,它會被多次觸發。更糟糕的是:當它被調用4次中的3次時,scrollview的scrollY爲0,而1次我得到正確的數量。但是,並不是每個第四次調用都是正確的,正確值被觸發的時刻是隨機的,我需要能夠聽取滾動位置0.

這裏是我用於觀察我的滾動視圖的代碼:

mScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { 

     @Override 
     public void onScrollChanged() { 
      Log.d("StupidScrollView", "Scroll positionY: " + mScrollView.getScrollY()); 
     } 
    }); 

輸出示例:

D/StupidScrollView﹕ Scroll positionY: 0 
D/StupidScrollView﹕ Scroll positionY: 0 
D/StupidScrollView﹕ Scroll positionY: 0 
D/StupidScrollView﹕ Scroll positionY: 77 

我不得不提一下,我在ViewPager和我的片段包含滾動型至極需要觀察。它聽起來像是一些與此相關的問題。

在此先感謝!

+0

我面臨完全相同的情況,在我的自定義視圖中,我有一個ViewTreeObserver,我需要檢查getY()的值,就像你的情況一樣,每個第二或第三個值都是正確的。你能指導我嗎?謝謝。 – ShahrozKhan91

回答

8

我看到你的問題,我自己有很多滾動視圖的麻煩..這裏是我的解決方案來獲取滾動視圖中的scrollvalue(我爲你添加了一個System.out)。

首先創建擴展滾動型的自定義類,並創建一個偵聽器在方法如這裏onScrollChanged:

public class ProductDetailScrollView extends ScrollView { 

    public interface OnScrollChangedListener { 
     void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt); 
    } 

    private OnScrollChangedListener mOnScrollChangedListener; 

    public void setOnScrollChangedListener(OnScrollChangedListener listener) { 
     mOnScrollChangedListener = listener; 
    } 

    @Override 
    protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
     super.onScrollChanged(l, t, oldl, oldt); 
     if (mOnScrollChangedListener != null) { 
      mOnScrollChangedListener.onScrollChanged(this, l, t, oldl, oldt); 
     } 
    } 

    public ProductDetailHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public ProductDetailHorizontalScrollView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ProductDetailHorizontalScrollView(Context context) { 
     super(context); 
    } 
} 

然後創建一個變量(在活性)mOnScrollChangedListener,並將其設置爲聽者對於mScrollView:

private ProductDetailScrollView.OnScrollChangedListener mOnScrollChangedListener = new ProductDetailScrollView.OnScrollChangedListener() { 
    public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) { 

     System.out.println("Scrolled: " + t); 

     //Parallax Effect on scroll 
     if (t > 0) { 
      final float newY = (t/4.0f) * -1.0f; 
      mProductImageContainer.setY(newY); 
     } else { 
      mProductImageContainer.setY(0.0f); 
     } 
    } 
}; 

在我的情況下,「T」的值是多少滾動已垂直變化,「L」是橫向滾動,而「oldl」 &「oldt」是的舊值t &升,所以如果你需要知道它的向上或向下滾動,如果(oldt> T)等。

並設置監聽器,你可以使用你的滾動視圖這樣的:

mScrollView.setOnScrollChangedListener(mOnScrollChangedListener); 
+0

嗨,感謝您的答案,但默認滾動查看沒有OnScrollChangedListener。 從什麼包你進口滾動查看?你可能有自己的lib還是自己實現了一些東西?正如我可以看到ProductDetailScrollView是一個自定義類,所以我想你錯過了這一點。 – Angelo

+0

嗨安傑洛,是的,沒錯。 Iam使用一個名爲productDetailScrollView的自定義類。我認爲標準的人也會擁有它,但現在看它,我看到我錯過了我的答案中的一些東西..我會更新我的答案:) –

+0

謝謝,不完全是我追求的解決方案,但指出我進入正確的方向! – Angelo

0

我有同樣的問題。我用android.support.v4.widget.NestedScrollView替換了我的ScrollView

然後實施NestedScrollView.OnScrollChangeListener

將聽衆附加到我的NestedScrollView

現在我正在檢測滾動更改。 :)