2014-07-18 19 views
7

मैं इस समस्या से पागल हो रहा हूं, अब 4 घंटों से इसमें खोद रहा हूं और मुझे लगता है कि मैं फिर से ध्यान केंद्रित नहीं कर सकता हूं, इसलिए यह एक आसान है।एंड्रॉइड ऑनस्कोल स्क्रॉलव्यू के लिए स्क्रॉल किए गए एकाधिक टाइम्स

मूल रूप से मैं एक scrollview पर scrolly यह करने के लिए एक onScrollChanges श्रोता साथ

मैं ViewTreeObserver उपयोग कर रहा हूँ (नहीं, मैं एक ग्रिड या एक सूची का उपयोग नहीं कर सकते हैं) का ट्रैक रखना चाहते हैं। हालांकि, यह कई बार निकाल दिया जाता है। इससे भी बदतर: जब इसे 4 बार 3 बार कहा जाता है, तो स्क्रॉलव्यू की स्क्रॉलवाई 0 और 1 बार मुझे सही राशि मिलती है। हालांकि, ऐसा नहीं है कि प्रत्येक 4 वें कॉल सही है, जिस क्षण सही मूल्य निकाल दिया जाता है वह यादृच्छिक है, और मुझे स्क्रॉलपॉशन 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 में हूँ और मेरा टुकड़े एक scrollview जो मनाया किए जाने की आवश्यकता होती है। यह किसी भी तरह से संबंधित कुछ मुद्दे की तरह लगता है।

अग्रिम धन्यवाद!

+0

मुझे एक ही स्थिति का सामना करना पड़ रहा है, मेरे कस्टम व्यू में मेरे पास व्यू ट्री ऑब्सर्वर है, और मुझे getY() मान की जांच करने की आवश्यकता है और बस आपके मामले की तरह, हर दूसरे या तीसरे मान सही हैं। क्या आप कृपया मुझे यहां मार्गदर्शन कर सकते हैं? धन्यवाद। – ShahrozKhan91

उत्तर

8

मुझे आपकी समस्या दिखाई देती है, मुझे स्क्रॉलव्यू के साथ बहुत सारी परेशानी हुई है .. स्क्रॉलव्यू में स्क्रॉलव्यू प्राप्त करने का मेरा समाधान यहां है (मैंने आपके लिए System.out जोड़ा)।

पहले कि scrollview फैली एक कस्टम वर्ग बनाएं और एक श्रोता कि विधि यहाँ के रूप में 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); 
     } 
    } 
}; 

मेरे मामले में "टी" मूल्य कितना स्क्रॉल खड़ी बदल दिया है, "l" क्षैतिज स्क्रॉल है, और "oldl" & "oldt" के पुराने मूल्य है टी &

mScrollView.setOnScrollChangedListener(mOnScrollChangedListener); 
+0

हाय, आपके उत्तर के लिए धन्यवाद, लेकिन डिफ़ॉल्ट स्क्रॉलव्यू में कोई ऑनस्क्रॉल चेंजलिस्ट नहीं है। स्क्रॉलव्यू किस पैकेज से आयात करते हैं? क्या आपके पास शायद एक lib है या कुछ खुद को लागू किया है? जैसा कि मैं देख सकता हूं ProductDetailScrollView एक कस्टम क्लास है इसलिए मुझे लगता है कि यह आपकी याद आ रही है। – Angelo

+0

हाय एंजेलो, हाँ यह सही है। Iam productDetailScrollView नामक कस्टम क्लास का उपयोग कर रहा हूं। मैंने सोचा कि मानक के पास भी यह होगा, लेकिन अब इसे देखकर मुझे लगता है कि मुझे अपने जवाब में कुछ चीजें याद आती हैं .. मैं अपना जवाब अपडेट करूंगा :) –

+0

धन्यवाद, बिल्कुल समाधान नहीं है जिसके बाद मैं गया लेकिन मुझे इंगित किया सही दिशा! – Angelo

0

मैं था: एल ताकि आप इस तरह अपने scrollview में अगर (oldt> टी) आदि ..

और तुम श्रोता सेट का उपयोग कर सकते है अगर आप या नीचे पता चला है कि यह स्क्रॉल किया है की जरूरत है वही मुद्दा। मैंने ScrollView को android.support.v4.widget.NestedScrollView के साथ बदल दिया।

फिर NestedScrollView.OnScrollChangeListener लागू किया गया।

श्रोता को मेरे NestedScrollView पर संलग्न किया गया।

और अब मैं स्क्रॉल परिवर्तन का पता लगा रहा हूं। :)

संबंधित मुद्दे