5

मैं RecyclerView हेडर के साथ बना रहा हूं जहां हेडर RecyclerView को स्क्रॉल करते समय हेडर ध्वस्त हो जाता है। मैं इसे पारदर्शी AppBarLayout, और MyCoolView के साथ नीचे दिए गए लेआउट के साथ बहुत करीब से प्राप्त कर सकता हूं जो हेडर है। लंबन प्रभाव बहुत अच्छा काम करता है।AppBarLayout को दबाए जाने से पहले AppBarLayout के नीचे स्क्रॉलिंग से रीसाइक्लिंग व्यू को रोकें

हालांकि, यदि हेडर अभी भी दिखाई दे रहा है और मैं RecyclerView को घुमाता हूं, तो आरवी धीरे-धीरे शीर्ष पर स्क्रॉल करता है और कुछ आइटम टूलबार के नीचे होते हैं जब तक आरवी दृश्य के शीर्ष तक नहीं पहुंच जाता। मैं scrollFlags के साथ खेल रहा हूं लेकिन एक वांछनीय परिणाम प्राप्त नहीं किया है। फ़्लिंग अनुभव को बेहतर बनाने के बारे में कोई सुझाव है ताकि आइटम फिसल न जाए?

वीडियो देखें और जब इसकी flinged घड़ी --- https://www.dropbox.com/s/jppd6m7zo41k23z/20160609_151309.mp4?dl=0

<android.support.design.widget.CoordinatorLayout> 

    <android.support.design.widget.AppBarLayout 
     android:background="#00000000"> 

     <android.support.design.widget.CollapsingToolbarLayout 
      app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

      <com.android.myapp.MyCoolView 
       app:layout_collapseMode="parallax"/> 

     </android.support.design.widget.CollapsingToolbarLayout> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v7.widget.RecyclerView/> 

</android.support.design.widget.CoordinatorLayout> 

उत्तर

5

संभव समाधान (untested)। अपने AppBarLayout पर OnOffsetChangedListener जोड़ें, और ऑफसेट मान को नोट रखें। , अब

AppBarLayout appbar = findViewById(...); 
appbar.addOnOffsetChangedListener(new OnOffsetChangedListener() { 
    @Override 
    void onOffsetChanged(AppBarLayout appbar, int offset) { 
     // Allow recycler scrolling only if we started collapsing. 
     this.shouldScroll = offset != 0; 
    } 
}); 

अपने RecyclerView करने के लिए एक पुस्तक श्रोता जोड़ें:

private boolean shouldScroll = false; 

फिर, onCreate: सबसे पहले, इस क्षेत्र को घोषणा करते हैं। जब भी यह स्क्रॉल करने के लिए कोशिश करता है, पुस्तक वापस लौटने अगर AppBarLayout अभी भी विस्तार किया जाता है:

RecyclerView recycler = findViewById(...); 
recycler.addOnScrollListener(new OnScrollListener() { 
    @Override 
    void onScrolled(RecyclerView recycler, int dx, int dy) { 
     // If AppBar is fully expanded, revert the scroll. 
     if (!shouldScroll) { 
      recycler.scrollTo(0,0); 
     } 
    } 
}); 

यह हालांकि कुछ फेरबदल की आवश्यकता हो सकती। मुझे दो मुद्दे दिखाई देते हैं:

  • स्क्रॉल करने के लिए संभावित स्टैक ओवरफ़्लो स्क्रॉल() वापस स्क्रॉल() वापस कॉल करता है। एक बूलियन के साथ हल किया जा सकता है या स्क्रॉल श्रोता
  • को हटाकर/जोड़कर संभवतः आप केवल स्क्रॉलिंग को रोकना नहीं चाहते हैं जब AppBarLayout पूरी तरह से विस्तारित हो, लेकिन अधिक आम तौर पर जब AppBarLayout ध्वस्त नहीं होता है। इसका मतलब है कि आपको offset != 0 की जांच करने की आवश्यकता नहीं है, बल्कि offset == appBarLayout.getTotalScrollRange() के लिए। मुझे लगता है।
+0

यह बहुत अच्छी तरह से काम करता है। ऑफसेट हमेशा शून्य से कम होता है, सिवाय इसके कि जब पूरी तरह से विस्तार किया जाता है। तो 'ऑफ़सेट> 0' काम नहीं करेगा। मैंने कुछ किया था जैसे 'mustScroll = appbar.getTotalScrollRange() == Math.abs (ऑफ़सेट) '। ऐसा लगता है कि यह काम नहीं कर रहा है। – ono

+0

हां, मैं इसके बारे में नकारात्मक होने के बारे में भूल गया। आपने सही किया – natario

+0

यह मेरे लिए बिल्कुल काम नहीं करता था। क्या किसी को कभी समाधान मिला? यह appbarlayout सीमा रेखा अनुपयोगी बनाता है। –

0

शायद आप अपने recylerView पर layout_behavior = "@ string/appbar_scrolling_view_behavior" जोड़ सकते हैं।

<android.support.v7.widget.RecyclerView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 
+0

मेरे पास यह है। मैं इसे ऊपर एक्सएमएल में शामिल करना भूल गया – ono

0

फ़्रेमलेआउट में रीसाइक्लिंग व्यू को लपेटना इस समस्या को हल करता है।

आपको रीसाइक्लर व्यू से फ़्रेमलेआउट पर appbar_scrolling_view_behavior को स्थानांतरित करने की भी आवश्यकता है, इसलिए इसे AppBarLayout के ठीक नीचे स्थित किया जाएगा।

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    > 

    <!--This RecyclerView MUST be wrapped in a FrameLayout--> 
    <!--This prevents the RecyclerView from going behind the AppBarLayout--> 
    <android.support.v7.widget.RecyclerView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 

</FrameLayout> 
संबंधित मुद्दे