RecyclerView स्क्रॉलिंग को अक्षम कैसे करें?


221

मैं स्क्रॉलिंग को अक्षम नहीं कर सकता RecyclerView। मैंने कॉल करने की कोशिश की rv.setEnabled(false)लेकिन मैं अभी भी स्क्रॉल कर सकता हूं।

मैं स्क्रॉलिंग को कैसे अक्षम कर सकता हूं?


1
RecyclerViewयदि आप स्क्रॉल नहीं करना चाहते हैं, तो उपयोग करने का क्या मतलब है ?
कॉमन्सवेयर

16
@CommonsWare, मैं इसे अस्थायी रूप से अक्षम करना चाहता हूं, उदाहरण के लिए, जबकि मैं अपने एक बच्चे के साथ एक कस्टम एनीमेशन कर रहा हूं।
Zsolt Safrany

1
आह, ठीक है, यह समझ में आता है। I'd've शायद एक पारदर्शी डाल Viewके दौरान शीर्ष RecyclerView, के बीच टॉगल VISIBLEऔर GONEजरूरत के रूप में है, लेकिन बंद अपने दृष्टिकोण कफ उचित लगता है।
कॉमन्सवेयर

आशा है कि यह एक बेहतर समाधान खोजने में मदद करता है।
सिटेजा पारसी

1
@CommonsWare, यहाँ उदाहरण के लिए मुझे इसकी क्या आवश्यकता है। मुझे आंशिक रूप से दिखाई देने वाली छवियों के बिना, मेरे व्यूपोर्ट में केवल एक बार, RecyclerView में छवियों को प्रदर्शित करने की आवश्यकता है। और बाईं ओर तीर हैं और दाईं ओर जो उपयोगकर्ता के साथ नेविगेट कर सकता है। वर्तमान में कौन सी छवि प्रदर्शित की जाती है (वे विभिन्न प्रकार की हैं) पर निर्भर करते हुए, RecyclerView के बाहर कुछ चीजें शुरू हो जाती हैं। यह डिजाइन हमारे ग्राहक चाहते हैं।
वरवरा कलिनािना

जवाबों:


368

आपको इसके लिए अपने रीसायकल के लेआउटमैन को ओवरराइड करना चाहिए। इस तरह से यह केवल स्क्रॉलिंग को अक्षम करेगा, कोई भी अन्य कार्य नहीं करेगा। आप अभी भी क्लिक या किसी अन्य स्पर्श की घटनाओं को संभालने में सक्षम होंगे। उदाहरण के लिए:-

मूल:

 public class CustomGridLayoutManager extends LinearLayoutManager {
 private boolean isScrollEnabled = true;

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

 public void setScrollEnabled(boolean flag) {
  this.isScrollEnabled = flag;
 }

 @Override
 public boolean canScrollVertically() {
  //Similarly you can customize "canScrollHorizontally()" for managing horizontal scroll
  return isScrollEnabled && super.canScrollVertically();
 }
}

यहाँ ".ScrollEnabled" ध्वज का उपयोग करके आप अस्थायी रूप से अपने रीसायकल-व्यू की स्क्रॉल कार्यक्षमता को सक्षम / अक्षम कर सकते हैं।

इसके अलावा:

स्क्रॉलिंग को अक्षम करने और क्लिक करने की अनुमति देने के लिए सरल आपके मौजूदा कार्यान्वयन को ओवरराइड करता है।

 linearLayoutManager = new LinearLayoutManager(context) {
 @Override
 public boolean canScrollVertically() {
  return false;
 }
};

2
यह सही उत्तर होना चाहिए क्योंकि यह मुझे क्लिक करने की अनुमति देते समय स्क्रॉल को अक्षम करता है।
जेरेड बुरो

10
डिफ़ॉल्ट लेआउटमैंगर्स पर स्क्रॉलिंग को अक्षम करना पहले से ही मौजूद होना चाहिए, एपीआई के एक उपयोगकर्ता को ऐसा नहीं करना चाहिए। जवाब के लिए धन्यवाद!
मार्टिन ओ'शि

1
क्या होगा अगर मैं स्क्रॉलिंग को केवल एक निश्चित आइटम से अक्षम करना चाहता हूं? मतलब आप इसे नीचे (या ऊपर) स्क्रॉल कर सकते हैं, लेकिन तब ब्लॉक कर सकते हैं, जब तक मैं इसे फिर से सक्षम नहीं करता?
Android डेवलपर

2
यह भी चिकनी को नियंत्रित करता हैसुविधाएँ
Mladen Rakonjac

4
आप कोटलिन संस्करण ऑब्जेक्ट जोड़ते हैं: LinearLayoutManager (यह) {ओवरराइड मज़ा canSrollVertically (): बूलियन {वापस झूठा}}
amorenew

149

असली जवाब है

recyclerView.setNestedScrollingEnabled(false);

प्रलेखन में अधिक जानकारी


39
यह केवल नेस्टिंग स्क्रॉलिंग को अक्षम करेगा, सभी स्क्रॉलिंग को नहीं। विशेष रूप से, यदि आपका RecyclerView एक स्क्रॉलव्यू में है, लेकिन स्क्रीन को नहीं भरता है, तो स्क्रॉलव्यू स्क्रॉल नहीं करेगा (सामग्री स्क्रीन में फिट होती है), और आपको अपने पुनरावर्तन दृश्य में स्क्रॉल UI मिलेगा (उदाहरण के लिए स्क्रॉल करने की कोशिश करते समय सूची प्रभाव का अंत) ) भले ही यह बड़ा होने पर स्क्रॉल नहीं करेगा। LayoutManager का विस्तार वास्तव में काम करता है।
personne3000

3
@ personne3000 मेरा मानना ​​है कि recyclerView.setHasFixedSize (सच) उसके लिए काम करता है। संपादित करें: मैं इसे सेटफिल्यूपोर्ट (सच) के साथ संयोजन के रूप में भी उपयोग करता हूं, इसलिए मुझे वास्तव में यकीन नहीं है कि दोनों में से कौन एक इसे ठीक करता है।
mDroidd

5
यह मेरे लिए ठीक काम करता है, लेकिन मेरा "RecyclerView" "स्क्रैच व्यू" का उपयोग करके एक फ्रैगमेंट लेआउट के अंदर था, इसलिए मुझे "NestedScrollView" द्वारा "स्क्रॉलव्यू" को बदलना पड़ा, जैसा कि यहां बताया गया है: stackoverflow.com/a/38088902/618464
educationoutinho

1
के लिए पूरी कक्षा के नाम का उपयोग करना याद रखें NestedScrollView: android.support.v4.widget.NestedScrollViewजैसा कि यहाँ बताया गया है, chessdork द्वारा: stackoverflow.com/questions/37846245/…
gustavoknz

4 घंटे बिताने के बाद यह पता लगाने की कोशिश की जा रही है कि यह क्या गलत है। मेरे मामले में मैं मोशन लयआउट के अंदर एक पुनर्नवीनीकरण का उपयोग कर रहा हूं। और मैंने केवल गति जोड़कर एक स्वाइप क्षेत्र जोड़ा है: TouchAnchorId = "@ id / swipe_nea"। यह सामान्य रूप से काम करता है लेकिन रिसाइक्लेरव्यू के खाली क्षेत्रों को छूने पर भी ट्रिगर हो जाता है। अन्य swipable तत्वों के साथ गति का उपयोग करते समय सावधान रहें।
ओ। कुमारू

73

वास्तविक जवाब है: एपीआई 21 और उससे अधिक के लिए:

कोई जावा कोड की जरूरत नहीं आप android:nestedScrollingEnabled="false" xml में सेट कर सकते हैं :

<android.support.v7.widget.RecyclerView
     android:id="@+id/recycler"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:clipToPadding="true"
     android:nestedScrollingEnabled="false"
     tools:listitem="@layout/adapter_favorite_place">

11
मुझे लगता है कि यह स्वीकृत उत्तर होना चाहिए, कक्षा में किसी भी प्रयास के बिना आप स्क्रॉलिंग को अक्षम कर सकते हैं और फिर भी लेआउट में स्पर्श की अनुमति है।
VipiN नेगी

21 से नीचे के एपीआई के लिए क्या है ??
मौआद अब्देलग़फ़ौर AITALI

@ निचले एपीआई के लिए आप उपयोग कर सकते हैं: recyclerView.setNestedScrollingEnabled (झूठा);
मिलाद फरीदिया

1
मेरे लिए स्वीकृत उत्तर।
फर्नांडो टोरेस

1
यह सबसे अच्छा और सबसे सीधा जवाब है, जो अनावश्यक कोड प्रदूषण और अंतहीन वर्ग विस्तार पैटर्न से भी बचता है।
राफेल सी

52

यह एक बिट हैकिश वर्कअराउंड है लेकिन यह काम करता है; आप स्क्रॉलिंग को सक्षम / अक्षम कर सकते हैं RecyclerView

यह RecyclerView.OnItemTouchListenerहर स्पर्श घटना को इस प्रकार लक्ष्य को अक्षम करने की एक खाली चोरी है RecyclerView

public class RecyclerViewDisabler implements RecyclerView.OnItemTouchListener {

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return true;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

उसका इस्तेमाल कर रहे हैं:

RecyclerView rv = ...
RecyclerView.OnItemTouchListener disabler = new RecyclerViewDisabler();

rv.addOnItemTouchListener(disabler);        // disables scolling
// do stuff while scrolling is disabled
rv.removeOnItemTouchListener(disabler);     // scrolling is enabled again 

8
क्या यह आइटम को क्लिक करने में अक्षम करता है?
जहीर फ़िक्विटिवा

@ जहीरफिकविवा हां। "यह एक खाली RecyclerView.nItemTouchListener है जो हर स्पर्श की घटना को चुरा रहा है"
मैक्स

1
यह माता-पिता के स्क्रॉल को भी अक्षम करता है
Jemshit Iskenderov

यह आइटम क्लिक को भी अक्षम करता है
मुहम्मद रियाज़

1
जब कोई साफ समाधान होता है, तो हैकिश वर्कअराउंड (साइड इफेक्ट्स के साथ) का उपयोग क्यों करें? सिर्फ लेआउट मैनजर (अन्य उत्तर देखें) को ओवरराइड करें
personne3000

37

यह मेरे लिए काम करता है:

  recyclerView.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
          return true;
      }
  });

11
यह सभी स्पर्श को अक्षम करता है।
जेरेड बुरो

1
अच्छी चाल! फिर से सक्षम करने के लिए, बस फिर से सेट करें onTouchListener का onTouch झूठा वापस करने के लिए
HendraWD

Custom view 'RecyclerView' has setOnTouchListener called on it but does not override performClick
उह

यदि आप वही चेतावनी प्राप्त कर रहे हैं जो @HendraWD ने ऊपर टिप्पणी में उल्लेख किया है, तो इस प्रश्न के उत्तर पर एक नज़र डालें: stackoverflow.com/questions/46135249/…
निकोलस कैरास्को

1
सच लौटने के बजाय, और इसलिए सभी प्रकार की स्पर्श घटनाओं को अक्षम करना, बस return e.getAction() == MotionEvent.ACTION_MOVE;इसके बजाय return true;केवल स्क्रॉल / स्वाइप इवेंट रद्द हो जाते हैं।
टॉफिक बैटचे जूल

15

आप अपने RecyclerView को फ्रीज़ करके स्क्रॉलिंग को अक्षम कर सकते हैं।

जमाने के लिए: recyclerView.setLayoutFrozen(true)

अनफ्रीज करने के लिए: recyclerView.setLayoutFrozen(false)


1
ध्यान दें: जब RecyclerView को फ्रीज किया जाता है तो बच्चे के विचार अपडेट नहीं किए जाते हैं। जब सभी आइटम दिखाने के लिए स्क्रीन पर पर्याप्त जगह हो तो मुझे स्क्रॉल को अक्षम करना होगा। ओह ... इस कार्य के लिए एक अच्छा एंड्रॉइड एपीआई क्या है ...
ओलेकेंड्रा नोस

1
एपीआई 28 में
अवक्षेपित

13

क्लास बनाएँ जो RecyclerView क्लास का विस्तार करें

public class NonScrollRecyclerView extends RecyclerView {

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

    public NonScrollRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public NonScrollRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();
    }
}

यह स्क्रॉल ईवेंट को अक्षम कर देगा, लेकिन क्लिक ईवेंट नहीं

अपने XML में इस का उपयोग करें निम्नलिखित करें:

  <com.yourpackage.xyx.NonScrollRecyclerView 
     ...
     ... 
  />

धन्यवाद! यह सब तब आवश्यक है जब हम पुनर्नवीनीकरण दृश्य को आंतरिक स्क्रॉलिंग के बिना सामग्री के अनुसार पूरी ऊंचाई लेने की अनुमति देना चाहते हैं। :)
राहुल रस्तोगी

लेकिन अगर यह पुनर्नवीनीकरण दृश्य स्क्रॉलिंग दृश्य (उदा .ScrollView) में है, तो लेआउट प्रबंधक को इसे से गलत तरीके से लौटने वाले canScrollVertically () विधि को ओवरराइड करना चाहिए।
राहुल रस्तोगी

@RahulRastogi स्क्रॉल व्यू के बजाय NestedScrollView का उपयोग करें
आशीष

अरे @ आशीषमंगवे, कृपया बताएं कि इसे फिर से कैसे सक्षम किया जाए
श्रुति

@ श्रुति हम यह कार्यक्रम नहीं कर सकते। bcz हम सीधे recyclerview's onMeasure मेथड को ओवरराइड करते हैं। आप इस recyclerView.setNestedScrollingEnabled (गलत) के लिए कोशिश कर सकते हैं। यह आपकी मदद करेगा
आशीष

11

यदि आप केवल स्क्रॉल कार्यक्षमता को अक्षम करते हैं RecyclerViewतो आप की setLayoutFrozen(true);विधि का उपयोग कर सकते हैं RecyclerView। लेकिन यह टच इवेंट को डिसेबल नहीं किया जा सकता है।

your_recyclerView.setLayoutFrozen(true);

यह विधि पदावनत है। क्या आप एक और सुझाव दे सकते हैं?
ऐयाज परमार

एपीआई 28 में
अवक्षेपित

9
recyclerView.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            // Stop only scrolling.
            return rv.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING;
        }
    });


यह स्पर्श करने पर smoothScrollToPosition () की स्क्रॉलिंग को रोक देता है।
ypresto

यह मेरे लिए सबसे अच्छा समाधान है क्योंकि यह प्रोग्राम को स्क्रॉल करने की अनुमति देता है लेकिन उपयोगकर्ता स्क्रॉलिंग से बचता है।
मिगुएल सेसमा

7

बहुत सरल उत्तर है।

LinearLayoutManager lm = new LinearLayoutManager(getContext()) {
                @Override
                public boolean canScrollVertically() {
                    return false;
                }
            };

उपरोक्त कोड RecyclerView को लंबवत स्क्रॉल करता है।



6

एक कोटलिन संस्करण लिखा:

class NoScrollLinearLayoutManager(context: Context?) : LinearLayoutManager(context) {
    private var scrollable = true

    fun enableScrolling() {
        scrollable = true
    }

    fun disableScrolling() {
        scrollable = false
    }

    override fun canScrollVertically() =
            super.canScrollVertically() && scrollable


    override fun canScrollHorizontally() =
            super.canScrollVertically()

 && scrollable
}

उपयोग:

recyclerView.layoutManager = NoScrollLinearLayoutManager(context)
(recyclerView.layoutManager as NoScrollLinearLayoutManager).disableScrolling()

5

बढ़ाएँ LayoutManagerऔर ओवरराइड canScrollHorizontally()और canScrollVertically()अक्षम स्क्रॉल करने के लिए।

ध्यान रखें कि शुरुआत में आइटम सम्मिलित करना स्वचालित रूप से शुरुआत में वापस स्क्रॉल नहीं करेगा, इसके लिए इसे प्राप्त करने के लिए कुछ ऐसा करें:

  private void clampRecyclerViewScroll(final RecyclerView recyclerView)
  {
    recyclerView.getAdapter().registerAdapterDataObserver(new RecyclerView.AdapterDataObserver()
    {
      @Override
      public void onItemRangeInserted(int positionStart, int itemCount)
      {
        super.onItemRangeInserted(positionStart, itemCount);
        // maintain scroll position at top
        if (positionStart == 0)
        {
          RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
          if (layoutManager instanceof GridLayoutManager)
          {
            ((GridLayoutManager) layoutManager).scrollToPositionWithOffset(0, 0);
          }else if(layoutManager instanceof LinearLayoutManager)
          {
            ((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(0, 0);
          }
        }
      }
    });
  }

1
यह भी निष्क्रिय करता है
Mladen Rakonjac

5

मुझे पता है कि यह पहले से ही एक स्वीकृत जवाब है, लेकिन समाधान मेरे द्वारा उपयोग किए गए उपयोग-मामले को ध्यान में नहीं रखता है।

मुझे विशेष रूप से एक हेडर आइटम की आवश्यकता थी जो अभी भी क्लिक करने योग्य था, फिर भी RecyclerView के स्क्रॉलिंग तंत्र को अक्षम कर दिया। यह निम्नलिखित कोड के साथ पूरा किया जा सकता है:

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
                            @Override
     public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
         return e.getAction() == MotionEvent.ACTION_MOVE;
     }

     @Override
     public void onTouchEvent(RecyclerView rv, MotionEvent e) {

     }

     @Override
     public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});

किसी कारण से, आपको काम करने के लिए आगे बढ़े बिना, केवल सही पर क्लिक करना होगा।
जेरेड बुरो

अच्छी बात है, @JaredBurrows। ऐसा इसलिए है क्योंकि हम ACTION_MOVE की अवहेलना कर रहे हैं। प्राकृतिक महसूस करने के लिए स्पर्श के लिए, स्क्रीन पर छूने और थोड़ी सी हलचल के बीच कुछ देना है। दुर्भाग्य से, मैं उस समस्या को हल करने में सक्षम नहीं था।
रेयान साइमन

धन्यवाद, वास्तव में मुझे क्या चाहिए!
स्टूडेंट

5

जैसा setLayoutFrozenकि वंचित है, आप उपयोग करके अपने RecyclerView को फ्रीज करके स्क्रॉलिंग को अक्षम कर सकते हैं suppressLayout

जमाने के लिए:

recyclerView.suppressLayout(true)

अनफ्रीज करने के लिए:

recyclerView.suppressLayout(false)

4

XML में: -

आप जोड़ सकते हो

android:nestedScrollingEnabled="false"

बच्चे में RecyclerView लेआउट XML फ़ाइल

या

जावा में: -

childRecyclerView.setNestedScrollingEnabled(false);

जावा कोड में अपने RecyclerView के लिए।

ViewCompat (जावा) का उपयोग करना: -

childRecyclerView.setNestedScrollingEnabled(false);केवल android_version> 21 उपकरणों में काम करेगा । सभी उपकरणों में काम करने के लिए निम्नलिखित का उपयोग करें

ViewCompat.setNestedScrollingEnabled(childRecyclerView, false);


एक्सेलेंट, सभी एपिस कवर किए गए हैं, उन्हें संचालित किया जाना चाहिए।
रिकार्ड

3

किसी कारण से @Alejandro Gracia जवाब कुछ सेकंड के बाद ही काम करना शुरू कर देता है। मुझे एक ऐसा समाधान मिला जो RecyclerView को तुरंत ब्लॉक करता है:

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
                return true;
            }
            @Override
            public void onTouchEvent(RecyclerView rv, MotionEvent e) {
            }
            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
            }
        });

3

OnTouchEvent () और onInceptceptTouchEvent () को ओवरराइड करें और यदि आपको OnItemTouchListener की आवश्यकता नहीं है, तो वापस लौटें। यह ViewHolders के OnClickListeners को अक्षम नहीं करता है।

public class ScrollDisabledRecyclerView extends RecyclerView {
    public ScrollDisabledRecyclerView(Context context) {
        super(context);
    }

    public ScrollDisabledRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public ScrollDisabledRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        return false;
    }
}

3

आप अपने एडेप्टर को सेट करने के बाद इस लाइन को जोड़ सकते हैं

ViewCompat.setNestedScrollingEnabled(recyclerView, false);

अब आपका रिसाइकिलवेरी स्मूथ स्क्रॉलिंग के साथ काम करेगा


2

मैं कुछ घंटों के लिए इस मुद्दे पर संघर्ष कर रहा था, इसलिए मैं अपना अनुभव साझा करना चाहूंगा, लेआउटमैनेजर समाधान के लिए यह ठीक है लेकिन अगर आप पुन: प्रयोज्य स्क्रॉल करना चाहते हैं तो पुनर्नवीनीकरण शीर्ष पर वापस आ जाएगा।

अब तक का सबसे अच्छा समाधान (मेरे लिए कम से कम) @Zsolt Safrany methode का उपयोग कर रहा है, लेकिन गेट्टर और सेटर को जोड़ने पर ताकि आपको OnItemTouchListener को निकालना या जोड़ना न पड़े।

निम्नलिखित अनुसार

public class RecyclerViewDisabler implements RecyclerView.OnItemTouchListener {

    boolean isEnable = true;

    public RecyclerViewDisabler(boolean isEnable) {
        this.isEnable = isEnable;
    }

    public boolean isEnable() {
        return isEnable;
    }

    public void setEnable(boolean enable) {
        isEnable = enable;
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return !isEnable;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {}

   @Override
   public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept){}
 }

प्रयोग

RecyclerViewDisabler disabler = new RecyclerViewDisabler(true);
feedsRecycler.addOnItemTouchListener(disabler);

// TO ENABLE/DISABLE JUST USE THIS
disabler.setEnable(enable);

2

कोटलिन में, यदि आप केवल एक मान सेट करने के लिए एक अतिरिक्त वर्ग नहीं बनाना चाहते हैं, तो आप LayoutManager से अनाम वर्ग बना सकते हैं:

recyclerView.layoutManager = object : LinearLayoutManager(context) {
    override fun canScrollVertically(): Boolean = false
}

1

यहाँ मैंने इसे डेटा बाइंडिंग के साथ किया है:

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipChildren="false"
                android:onTouch="@{(v,e) -> true}"/>

"सच" के स्थान पर मैंने एक बूलियन चर का उपयोग किया जो एक शर्त के आधार पर बदल गया ताकि पुनर्नवीनीकरण दृश्य अक्षम और सक्षम होने के बीच स्विच हो जाए।


1

एक ऐसे टुकड़े के साथ आया जिसमें कई रीसायकल व्यू हैं, इसलिए मुझे प्रत्येक रीसायकल व्यू में एक स्क्रॉलबार के बजाय केवल एक स्क्रॉलबार की आवश्यकता है।

इसलिए मैंने अभी स्क्रॉलव्यू को मूल कंटेनर में रखा है जिसमें 2 रीसायकल व्यू और रिसाइकल व्यू android:isScrollContainer="false"में उपयोग होता है

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutManager="LinearLayoutManager"
    android:isScrollContainer="false" />

1

जोड़ना

android:descendantFocusability="blocksDescendants"

आपके बच्चे के SrollView या NestedScrollView (और ListView के माता-पिता, recyclerview और किसी एक को ग्रिडव्यू)


1

स्क्रॉलिंग को अक्षम करने का एक और अधिक सरल तरीका है (तकनीकी रूप से यह एक स्क्रॉलिंग इवेंट का अवरोधन है और जब कोई शर्त पूरी होती है तो इसे समाप्त कर देता है), बस मानक कार्यक्षमता का उपयोग करके। RecyclerViewविधि को बुलाया गया है addOnScrollListener(OnScrollListener listener), और इसका उपयोग करके आप इसे स्क्रॉल करने से रोक सकते हैं, बस:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (viewModel.isItemSelected) {
            recyclerView.stopScroll();
        }
    }
});

मामले का उपयोग करें: मान लें कि आप स्क्रॉल करना चाहते हैं जब आप किसी एक आइटम पर क्लिक करते हैं, RecyclerViewतो आप इसके साथ कुछ क्रिया कर सकते थे, बिना किसी अन्य आइटम पर गलती से स्क्रॉल किए बिना, और जब आप इसके साथ काम करते हैं, तो बस पर क्लिक करें स्क्रॉल करने में सक्षम करने के लिए आइटम फिर से। उसके लिए, आप अनुलग्न करना चाहते हैं OnClickListenerके भीतर हर आइटम के लिए RecyclerViewहै, इसलिए जब आप किसी आइटम पर क्लिक करें, यह टॉगल होगा isItemSelectedसे falseकरने के लिए true। इस तरह जब आप स्क्रॉल करने की कोशिश RecyclerViewकरेंगे , तो स्वचालित रूप से कॉल विधि होगी onScrollStateChangedऔर isItemSelectedसेट होने के बाद true, यह तुरंत, पहले बंद हो जाएगाRecyclerView कि मौका मिला, अच्छी तरह से ... स्क्रॉल करने के लिए।

नोट: बेहतर प्रयोज्य के लिए, क्लिकों को रोकने के GestureListenerबजाय उपयोग करने का प्रयास करें ।OnClickListeneraccidental


stopScroll()स्क्रॉल को फ्रीज करने के लिए नहीं है, यह सिर्फ recyclerview स्क्रॉल को रोकने / रोकने के लिए है।
फरीद

@FARID, हाँ, यह विधि अभी प्रगति में किसी भी स्क्रॉल को रोकती है, और इस विशेष मामले में, यह हर बार होता है जब कोई उपयोगकर्ता isItemSelectedसेट के साथ RecyclerView सामग्री को स्क्रॉल करने का प्रयास करता है true। अन्यथा, आपको अच्छे के लिए स्क्रॉलिंग को अक्षम करने के लिए एक कस्टम RecyclerView की आवश्यकता होगी और मैं इससे बचना चाहता था क्योंकि मुझे बस थोड़ी अतिरिक्त कार्यक्षमता की आवश्यकता थी, जो यह समाधान प्रदान करता है।
टिम जोर्जेव

0

बस इसे xml में अपने रीसायकलव्यू में जोड़ें

 android:nestedScrollingEnabled="false"

इस तरह

<android.support.v7.widget.RecyclerView
                    android:background="#ffffff"
                    android:id="@+id/myrecycle"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:nestedScrollingEnabled="false">

0

स्पर्श से स्क्रॉल करना बंद करें, लेकिन कमांड के माध्यम से स्क्रॉल करते रहें:

if (appTopBarMessagesRV == null) {appTopBarMessagesRV = findViewById (R.id.mainBarScrollMessagesRV);

        appTopBarMessagesRV.addOnItemTouchListener(new RecyclerView.SimpleOnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

                if ( rv.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING)
                {
                     // Stop  scrolling by touch

                    return false;
                }
                return  true;
            }
        });
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.