स्क्रॉलव्यू के अंदर Recyclerview सुचारू रूप से स्क्रॉल नहीं कर रहा है


179

अपने ऐप के लिए मैं इस लाइब्रेरी का उपयोग करते हुए इसकी सामग्री के आधार पर ऊंचाई के RecyclerViewअंदर एक ScrollViewजगह का उपयोग कर रहा हूं । स्क्रॉलिंग काम कर रही है लेकिन जब मैं स्क्रॉल करता हूं तो यह आसानी से काम नहीं करता है । जब मैं खुद को स्क्रॉल करता हूं तो यह आसानी से स्क्रॉल होता है।RecyclerViewRecyclerViewScrollView

कोड मैं परिभाषित करने के लिए उपयोग कर रहा हूं RecyclerView:

LinearLayoutManager friendsLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext(), android.support.v7.widget.LinearLayoutManager.VERTICAL, false);
mFriendsListView.setLayoutManager(friendsLayoutManager);
mFriendsListView.addItemDecoration(new DividerItemDecoration(getActivity().getApplicationContext(), null));

RecyclerViewमें ScrollView:

<android.support.v7.widget.RecyclerView
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp"
    android:id="@+id/friendsList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

यह समाधान मेरे लिए काम करता है: stackoverflow.com/a/32390370/7308789 शुक्रिया
हौसिन बॉल्ला

1
@ दत्तदेव आपके मामले में वास्तव में क्या काम नहीं कर रहे हैं कृपया उस पर अधिक विस्तार करें। इसके अलावा, ऐसा लगता है कि आपके मामले में कोई समाधान उपलब्ध नहीं कराया गया है, क्या ऐसा है?
प्रवीण दिवारनिया

का प्रयोग करें androidx.constraintlayout.widget.ConstraintLayoutजो किसी भी जटिल कार्यान्वयन के बिना अपने समस्या का समाधान होगा
Saswata

जवाबों:


379

करने की कोशिश करो:

RecyclerView v = (RecyclerView) findViewById(...);
v.setNestedScrollingEnabled(false);

एक विकल्प के रूप में, आप समर्थन डिज़ाइन लाइब्रेरी का उपयोग करके अपने लेआउट को संशोधित कर सकते हैं। मुझे लगता है कि आपका वर्तमान लेआउट कुछ ऐसा है:

<ScrollView >
   <LinearLayout >

       <View > <!-- upper content -->
       <RecyclerView > <!-- with custom layoutmanager -->

   </LinearLayout >
</ScrollView >

आप इसे संशोधित कर सकते हैं:

<CoordinatorLayout >

    <AppBarLayout >
        <CollapsingToolbarLayout >
             <!-- with your content, and layout_scrollFlags="scroll" -->
        </CollapsingToolbarLayout >
    </AppBarLayout >

    <RecyclerView > <!-- with standard layoutManager -->

</CoordinatorLayout >

हालाँकि यह एक लंबी सड़क है, और यदि आप कस्टम रैखिक लेआउट प्रबंधक के साथ ठीक हैं, तो बस पुनर्नवीनीकरण दृश्य पर नेस्टेड स्क्रॉलिंग को अक्षम करें।

संपादित करें (4/3/2016)

v 23.2समर्थन पुस्तकालयों की रिहाई में अब सभी डिफ़ॉल्ट LayoutManagerएस में एक फैक्ट्री "रैप कंटेंट" फीचर शामिल है । मैंने इसका परीक्षण नहीं किया, लेकिन आपको शायद इसे उस पुस्तकालय के लिए पसंद करना चाहिए जिसका आप उपयोग कर रहे थे।

<ScrollView >
   <LinearLayout >

       <View > <!-- upper content -->
       <RecyclerView > <!-- with wrap_content -->

   </LinearLayout >
</ScrollView >

16
इस उत्तर के लिए जोड़ने के लिए: setNestedScrollingEnabled(false)केवल काम किया जब मैं बाहर बंद ScrollViewएक के लिए NestedScrollViewबजाय।
रिचर्ड ले मेसियर

11
मेरे लिए, setNestedScrollingEnabled(false)मुझे मेरे RecyclerViewअंदर से एक के साथ चिकनी स्क्रॉल वापस दिया ScrollView- धन्यवाद! लेकिन मुझे अभी भी समझ नहीं आया कि यह काम क्यों करता है ...? नेस्टेड स्क्रॉलिंग को झूठा सेट करने का वास्तव में क्या मतलब है?
माइक्रो

33
ध्यान दें कि android:nestedScrollingEnabled="false"केवल API 21+ के लिए काम करता है लेकिन v.setNestedScrollingEnabled(false)<21 के लिए ठीक है।
एरिक बी।

3
भविष्य के संदर्भ के लिए, अगर किसी को भी RecyclerViewअंदर_परेंट मुद्दे का सामना करना पड़ रहा है, ScrollViewजो केवल मार्शमैलो / नूगट (एपीआई 23, 24) उपकरणों पर होता है, तो stackoverflow.com/a/38995399/132121
हुसैन खान

2
इस समाधान के लिए एक नकारात्मक पक्ष मैं अभी अनुभव कर रहा हूं वह यह है कि RecyclerView को ऑनस्क्रीन कंट्रोलर में ईवेंट प्राप्त नहीं होंगे। जो मुझे चाहिए क्योंकि मैं अधिक डेटा प्राप्त करना चाहता हूं जब मेरे पास
डैनियल डब्ल्यू।

82

मुझे केवल इसका उपयोग करने की आवश्यकता है:

mMyRecyclerView.setNestedScrollingEnabled(false);

मेरे onCreateView()तरीके में।

आपका बहुत बहुत धन्यवाद!


26

आप इस तरह से उपयोग कर सकते हैं:

इस लाइन को अपने recyclerView xml फ़ाइल में जोड़ें:

android:nestedScrollingEnabled="false"

या जावा कोड में:

RecyclerView.setNestedScrollingEnabled(false);

आशा है कि इससे मदद मिली।


10
आपी 21+ की आवश्यकता है
मुहम्मद रियाज़

11

आप XML और प्रोग्रामेटिक रूप से दोनों तरीकों से कोशिश कर सकते हैं। लेकिन आप जिस समस्या का सामना कर सकते हैं, वह (एपीआई 21 से नीचे) एक्सएमएल के साथ करने से काम नहीं चलेगा। इसलिए इसे अपने एक्टिविटी / फ्रैगमेंट में प्रोग्रामेटिक रूप से सेट करना बेहतर है।

XML कोड:

<android.support.v7.widget.RecyclerView
      android:id="@+id/recycleView"
      android:layout_width="match_parent"
      android:visibility="gone"
      android:nestedScrollingEnabled="false"
      android:layout_height="wrap_content"
      android:layout_below="@+id/linearLayoutBottomText" /> 

प्रोग्राम के रूप में:

 recycleView = (RecyclerView) findViewById(R.id.recycleView);
 recycleView.setNestedScrollingEnabled(false);

6

स्क्रॉल दृश्य के बजाय नेस्टेड स्क्रॉल दृश्य का उपयोग करने से मेरी समस्या हल हो गई

<LinearLayout> <!--Main Layout -->
   <android.support.v4.widget.NestedScrollView>
     <LinearLayout > <!--Nested Scoll View enclosing Layout -->`

       <View > <!-- upper content --> 
       <RecyclerView >


     </LinearLayout > 
   </android.support.v4.widget.NestedScrollView>
</LinearLayout>

5

मेरे पास इसी तरह के मुद्दे थे (मैंने Google PlayStore डिज़ाइन की तरह एक नेस्टेड RecyclerViews बनाने की कोशिश की)। इससे निपटने का सबसे अच्छा तरीका है कि बच्चे को RecyclerView को कम करके और 'onInterceptTouchEvent' और 'onTouchEvent' तरीकों को ओवरराइड करके। इस तरह से आप उन घटनाओं को कैसे नियंत्रित करते हैं और अंततः स्क्रॉल करते हैं, इसका पूरा नियंत्रण मिलता है।


3

NestedScrollView के साथ स्क्रॉल दृश्य की जगह नीचे की ओर चिकनी स्क्रॉलिंग हुई।


1

यदि आप अपने चाइल्डव्यू में VideoView या भारी वजन विजेट का उपयोग कर रहे हैं, तो अपने RecyclerView को wrap_content NestedScrollView के अंदर ऊंचाई के साथ ऊंचाई पर रखें और match_parent फिर स्क्रॉल करना उतना ही आसान काम करेगा जितना आप चाहते हैं।

FYI करें,

<android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:nestedScrollingEnabled="false"
            android:layout_height="wrap_content"
            android:clipToPadding="false" />

</android.support.v4.widget.NestedScrollView>

धन्यवाद माइक्रो यह आपके संकेत से था!

कार्तिक


1

सभी उत्तरों का सारांश (लाभ और हानि)

एकल पुनरावर्तन के लिए

आप इसे समन्वयक लेआउट के अंदर उपयोग कर सकते हैं।

फायदा - यह पूरे रिसाइकलव्यू आइटम को लोड नहीं करेगा। इतनी चिकनी लोडिंग।

नुकसान - आप समन्वयक लेआउट के अंदर दो पुनर्नवीनीकरण को लोड नहीं कर सकते हैं - यह स्क्रॉलिंग समस्याओं का उत्पादन करता है

संदर्भ - https://stackoverflow.com/a/33143512/3879847

न्यूनतम पंक्तियों के साथ कई पुनर्नवीनीकरण के लिए

आप NestedScrollView के अंदर लोड कर सकते हैं

फायदा - यह आसानी से स्क्रॉल करेगा

नुकसान - यह recyclerview की सभी पंक्तियों को लोड करता है ताकि आपकी गतिविधि देरी से खुले

संदर्भ - https://stackoverflow.com/a/33143512/3879847

बड़ी पंक्तियों (100 से अधिक) के साथ कई पुनरावृत्ति के लिए

आपको recyclerview के साथ जाना चाहिए।

फायदा - आसानी से स्क्रॉल करें, आसानी से लोड करें

नुकसान - आपको अधिक कोड और तर्क लिखने की आवश्यकता है

मल्टी-व्यूहोल्डर्स की मदद से प्रत्येक रिसाइकलव्यू को मुख्य रिसाइक्लेव्यू के अंदर लोड करें

उदाहरण के लिए:

MainRecyclerview

-ChildRecyclerview1 (ViewHolder1)

-ChildRecyclerview2 (ViewHolder2)

-ChildRecyclerview3 (ViewHolder3) 

-Any other layout   (ViewHolder4)

मल्टी-व्यूहॉल्डर का संदर्भ - https://stackoverflow.com/a/26245463/3879847


0

XML कोड:

<android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <android.support.v7.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:clipToPadding="false" />

        </android.support.v4.widget.NestedScrollView>

जावा कोड में:

  recycleView = (RecyclerView) findViewById(R.id.recycleView);
     recycleView.setNestedScrollingEnabled(false);


0
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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">

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent">

            <android.support.constraint.ConstraintLayout
                android:id="@+id/constraintlayout_main"
                android:layout_width="match_parent"
                android:layout_height="@dimen/layout_width_height_fortyfive"
                android:layout_marginLeft="@dimen/padding_margin_sixteen"
                android:layout_marginRight="@dimen/padding_margin_sixteen"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent">

                <TextView
                    android:id="@+id/textview_settings"
                    style="@style/textviewHeaderMain"
                    android:gravity="start"
                    android:text="@string/app_name"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent" />

            </android.support.constraint.ConstraintLayout>

            <android.support.constraint.ConstraintLayout
                android:id="@+id/constraintlayout_recyclerview"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/padding_margin_zero"
                android:layout_marginTop="@dimen/padding_margin_zero"
                android:layout_marginEnd="@dimen/padding_margin_zero"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/constraintlayout_main">

                <android.support.v7.widget.RecyclerView
                    android:id="@+id/recyclerview_list"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:nestedScrollingEnabled="false"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent" />

            </android.support.constraint.ConstraintLayout>

        </android.support.constraint.ConstraintLayout>

    </android.support.v4.widget.NestedScrollView>

</android.support.constraint.ConstraintLayout>

यह कोड ConstraintLayout Android के लिए काम कर रहा है


0

Kotlin

सेट isNestedScrollingEnabledकरने के लिए falseहर RecyclerView है कि स्क्रॉल व्यू के नीचे के लिए

val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.isNestedScrollingEnabled = false

XML लेआउट का उपयोग करना

<android.support.v7.widget.RecyclerView
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp"
    android:id="@+id/friendsList"
    android:layout_width="match_parent"
    android:nestedScrollingEnabled="false"
    android:layout_height="wrap_content" />
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.