2014-07-18 11 views
7

birden çok kez Yakıtlı ve bu kolay bir olup olmadığını tekrar çok üzgünüm odaklı olsun edemez düşünüyorum.Android onScrollChanged şimdi 4 saat içine beri kazma, ben bu sorunla deli alıyorum

Temelde ben Scrollview'a üzerinde ScrollY buna bir onScrollChanges İşleyici ile

Ben ViewTreeObserver kullanıyorum (hayır, ben bir ızgara veya bir liste kullanamazsınız) izlemek istiyoruz. Ancak, birden çok kez kovulur. Daha da kötüsü: 4 kez 3 kez çağrıldığında, scrollview'ın scrollY değeri 0 ve 1 defa doğru miktarı alırım. Ancak, her 4. çağrı doğru değil, doğru değerin ne zaman ateş edildiği an rastgele değil ve kaydırma pozisyonunu dinleyebilmem gerekiyor. 0

Scrollview'ımı gözlemlemek için kullandığım Kod İşte:

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

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

Örnek çıktı: Ben söz var

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

, ben ViewPager yaşıyorum ve benim fragmanları bir Scrollview wich gözlenen gerekmektedir içerirler. Bir şekilde bununla ilgili bir sorun gibi geliyor.

Şimdiden teşekkürler! Sorununu bkz

+0

, benim özel görünümde Bir ViewTreeObserver var ve getY() değeri ve sadece vaka gibi kontrol etmeniz gerekir, her 2 veya 3 değerleri doğru. Bana rehberlik edebilir misiniz lütfen? Teşekkürler. – ShahrozKhan91

cevap

8

i İşte Scrollview içinde ScrollValue almak benim çözümdür .. kendim scrollviews ile çok problem oldu (Sana bir System.out eklendi).

İlk scrollview genişleten özel bir sınıf oluşturmak ve yöntem olarak burada onScrollChanged bir dinleyici oluşturun:

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

Sonra ben (aktivitesinde) bir değişken oluşturmak mOnScrollChangedListener ve dinleyici olarak ayarlayın mScrollView için:

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

benim durumumda "t" değeri "l" yatay kaydırma olduğunu, dikey değişti ve "buharlaştınîdı" & eski değer "oldt" dir ne kadar kaydırma olduğunu t & Eğer o kadar kaydırılan oluyor bilmem gerekiyor veya aşağı if (oldt> t) vb ..

Ve dinleyici ayarlayın eğer l böyle senin Scrollview içinde kullanabilmesi:

mScrollView.setOnScrollChangedListener(mOnScrollChangedListener); 
+0

Merhaba, Cevabınız için teşekkürler, ancak Varsayılan Scrollview'de OnScrollChangedListener bulunmuyor. Hangi paketten Scrollview'i içe aktarıyorsunuz? belki bir lib var mı yoksa kendi başına bir şey mi uyguladın? Ben ProductDetailScrollView görebildiğim gibi özel bir sınıf olduğunu, bu yüzden eksik bu olduğunu düşünüyorum. – Angelo

+0

Merhaba Angelo, evet doğru. ProductDetailScrollView adlı özel bir sınıf kullanarak Iam. Ben de standart bir tane olurdu düşünürdüm, ama şimdi baktığımda ben cevabım bazı şeyleri özledim görüyorum .. Cevabımı güncelleyeceğim :) –

+0

Teşekkürler, tam olarak sonra gittim Çözüm değil ama bana işaret etti. doğru yön! – Angelo

0

vardı aynı sorun. ScrollView'u android.support.v4.widget.NestedScrollView ile değiştirdim.

Sonra NestedScrollView.OnScrollChangeListener uyguladı.

benim NestedScrollView için Dinleyici Ekli.

Ve şimdi tespit ediyorum kaydırma değişir. :) Ben aynı durumla karşı karşıya am

İlgili konular