NestedScrollView के अंदर RecyclerView का उपयोग कैसे करें?


210

RecyclerViewअंदर का उपयोग कैसे करें NestedScrollView? RecyclerViewएडॉप्टर सेट करने के बाद सामग्री दिखाई नहीं देती है।

अद्यतन लेआउट कोड अपडेट किया गया।

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="@dimen/keyline_1">

    </RelativeLayout>

    <View
        android:id="@+id/separator"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#e5e5e5" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/conversation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

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


@Mecid स्क्रॉल दृश्य (या NestedScrollView) के अंदर RecyclerView का उपयोग करने के लिए कोई कारण नहीं हैं।
गेब्रियल मारीओटी

2
@ कभी भी आपको स्क्रॉल करने योग्य दृश्य को किसी अन्य स्क्रॉल करने योग्य दृश्य के अंदर नहीं रखना चाहिए। यह एंड्रॉइड में एक सामान्य नियम है।
गैब्रिएल मारीओटी

6
@GabrieleMariotti मैं इस नियम को जानता हूं, लेकिन NestedScrollView ने इस समस्या को ठीक करने के लिए विकसित किया है।
मकिद

1
यह सही नहीं है। NestedScrollView स्क्रॉलव्यू की तरह ही है, लेकिन यह एक नेस्टेड स्क्रॉलिंग माता-पिता और बच्चे दोनों के रूप में अभिनय का समर्थन करता है। आपके मामले में आपको अपने स्वयं के स्क्रॉलिंग व्यवहार को परिभाषित करना होगा।
गैब्रियल मारीओटी

जवाबों:


216

अपने recyclerView को इसके साथ बदलें,

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

यहाँ,

app:layout_behavior="@string/appbar_scrolling_view_behavior"

बाकी चीजों का प्रबंधन करेगा।

एक और बात, NestedScrollView के अंदर अपना recyclerView डालने की कोई आवश्यकता नहीं है


33
मुझे समझ नहीं आ रहा है कि इस समाधान को सबसे अधिक वोट क्यों नहीं मिलते हैं। यह NestedScrollViewकेवल हासिल नहीं है, बल्कि इसके साथ है app:layout_behavior="@string/appbar_scrolling_view_behavior"। यह कुंजी है!
हेटा

3
@RahulUpadhyay ने मेरे लिए यह काम किया, लेकिन मुझे लगता है कि आपकी अंतिम पंक्ति गलत है, अगर यह एक NestedScrollView के अंदर है, तो RecyclerView बिल्कुल नहीं दिखाता है। हालाँकि, आप सुपरस्टार हैं: D
लियोन

3
यह काम करता हैं! बस अद्यतन करें recyclerview पुस्तकालय संकलन 'com.android.support:recyclerview-v7:+'
फैबियो गुएरा

28
यह समाधान के साथ इस्तेमाल किया जा करने का इरादा है CoordinatorLayout, AppBarLayout, और उचित स्थापना के layout_scrollFlagsबच्चे दृश्य (ओं) उस के साथ स्क्रॉल किया जाना चाहिए पर RecyclerView। निश्चित नहीं है कि यह उत्तर से क्यों छोड़ा गया था। अन्यथा, यह एक अच्छा और सरल उपाय है।
संविवेल

9
मुझे लगता है कि यह समझने के लिए बहुत महत्वपूर्ण है कि RecyclerView की रिसाइकलिंग यहां काम नहीं करती है। नतीजतन, यदि आपके पास मदों की एक लंबी सूची है, तो यह ध्यान देने योग्य यूआई फ्रीज के साथ दिखाई देगा।
11

121

अद्यतन १

एंड्रॉइड सपोर्ट लाइब्रेरी 23.2.0 के बाद से लेआउटमैन के setAutoMeasureEnabled(true)लिए जोड़ा गया तरीका था। यह सामग्री को लपेटने के लिए RecyclerView बनाता है और एक आकर्षण की तरह काम करता है।
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

तो बस कुछ इस तरह से जोड़ें:

    LayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setAutoMeasureEnabled(true);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setNestedScrollingEnabled(false);


अद्यतन २

चूंकि 27.1.0 setAutoMeasureEnabledको पदावनत किया जाता है, इसलिए आपको ओवरराइड पद्धति के साथ लेआउटमैनेजर का कस्टम कार्यान्वयन प्रदान करना चाहिएisAutoMeasureEnabled()

लेकिन उपयोग के कई मामलों के बाद RecyclerView मैं दृढ़ता से इसे रैपिंग मोड में उपयोग नहीं करने की सलाह देता हूं , क्योंकि यह वह नहीं है जो इसके लिए अभिप्रेत है। कई मदों के प्रकारों के साथ सामान्य एकल RecyclerView का उपयोग करके अपने पूरे लेआउट को फिर से बनाने की कोशिश करें। या LinearLayout के साथ दृष्टिकोण का उपयोग करें जिसे मैंने नीचे अंतिम उपाय के रूप में वर्णित किया है


पुराना उत्तर (अनुशंसित नहीं)

आप RecyclerViewअंदर उपयोग कर सकते हैं NestedScrollView। सबसे पहले आपको अपने स्वयं के कस्टम को लागू करना चाहिए LinearLayoutManager, यह आपकी RecyclerViewसामग्री को लपेटने के लिए बनाता है। उदाहरण के लिए:

public class WrappingLinearLayoutManager extends LinearLayoutManager
{

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

    private int[] mMeasuredDimension = new int[2];

    @Override
    public boolean canScrollVertically() {
        return false;
    }

    @Override
    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
            int widthSpec, int heightSpec) {
        final int widthMode = View.MeasureSpec.getMode(widthSpec);
        final int heightMode = View.MeasureSpec.getMode(heightSpec);

        final int widthSize = View.MeasureSpec.getSize(widthSpec);
        final int heightSize = View.MeasureSpec.getSize(heightSpec);

        int width = 0;
        int height = 0;
        for (int i = 0; i < getItemCount(); i++) {
            if (getOrientation() == HORIZONTAL) {
                measureScrapChild(recycler, i,
                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                        heightSpec,
                        mMeasuredDimension);

                width = width + mMeasuredDimension[0];
                if (i == 0) {
                    height = mMeasuredDimension[1];
                }
            } else {
                measureScrapChild(recycler, i,
                        widthSpec,
                        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                        mMeasuredDimension);

                height = height + mMeasuredDimension[1];
                if (i == 0) {
                    width = mMeasuredDimension[0];
                }
            }
        }

        switch (widthMode) {
            case View.MeasureSpec.EXACTLY:
                width = widthSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        switch (heightMode) {
            case View.MeasureSpec.EXACTLY:
                height = heightSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        setMeasuredDimension(width, height);
    }

    private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
            int heightSpec, int[] measuredDimension) {

        View view = recycler.getViewForPosition(position);
        if (view.getVisibility() == View.GONE) {
            measuredDimension[0] = 0;
            measuredDimension[1] = 0;
            return;
        }
        // For adding Item Decor Insets to view
        super.measureChildWithMargins(view, 0, 0);
        RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
        int childWidthSpec = ViewGroup.getChildMeasureSpec(
                widthSpec,
                getPaddingLeft() + getPaddingRight() + getDecoratedLeft(view) + getDecoratedRight(view),
                p.width);
        int childHeightSpec = ViewGroup.getChildMeasureSpec(
                heightSpec,
                getPaddingTop() + getPaddingBottom() + getDecoratedTop(view) + getDecoratedBottom(view),
                p.height);
        view.measure(childWidthSpec, childHeightSpec);

        // Get decorated measurements
        measuredDimension[0] = getDecoratedMeasuredWidth(view) + p.leftMargin + p.rightMargin;
        measuredDimension[1] = getDecoratedMeasuredHeight(view) + p.bottomMargin + p.topMargin;
        recycler.recycleView(view);
    }
}

इसके बाद इसे LayoutManagerअपने लिए इस्तेमाल करेंRecyclerView

recyclerView.setLayoutManager(new WrappingLinearLayoutManager(getContext()));

लेकिन आपको उन दो तरीकों को भी कॉल करना चाहिए:

recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);

यहां setNestedScrollingEnabled(false)स्क्रॉलिंग को अक्षम करें RecyclerView, इसलिए यह स्क्रॉलिंग इवेंट को इंटरसेप्ट नहीं करता है NestedScrollView। और setHasFixedSize(false)निर्धारित करें कि एडेप्टर सामग्री में परिवर्तन के आकार को बदल सकते हैंRecyclerView

महत्वपूर्ण नोट: यह समाधान कुछ मामलों में थोड़ा छोटा है और इसमें ख़ुराक के साथ समस्याएँ हैं, इसलिए यदि आपके पास बहुत से आइटम हैं तो RecyclerViewमैं LinearLayoutसूची दृश्य के कस्टम- आधारित कार्यान्वयन का उपयोग करने की सलाह दूंगा, इसके लिए एडेप्टर का एनालॉग बनाएं और इसे बनाएं जैसा व्यवहार ListViewयाRecyclerView


19
सावधान! यदि आपके पास बहुत से आइटम हैं, तो इसका उपयोग न करें RecyclerView
ब्रिस गाबिन

1
@BraisGabin, आप सही कह रहे हैं: setHasFixedSize (झूठा) RecyclerView के कई ताज़ा करने का कारण बनता है, इसलिए यदि इसमें बहुत सारे आइटम हैं, तो यह बहुत धीमी गति से काम करेगा। उन मामलों में मैं LinearLayout का उपयोग एक प्रकार के कस्टम "अडैप्टर" के साथ करता हूं ताकि यह लिस्टव्यू या RecyclerView की तरह व्यवहार करे
smbd uknow

1
आपका बहुत बहुत धन्यवाद! मुझे घंटों बचाया। वैसे, इस लेआउट प्रबंधक (और केवल एक के साथ), संभव बग के साथ अंतिम आइटम सजावट प्रदर्शित नहीं की गई है?
21

2
setAutoMeasureEnabled को एपीआई स्तर 27.1.0 डेवलपर.
Dika

2
ओवरराइड बूलियन isAutoMeasureEnabled () के बजाय। यह लौटाता है कि क्या लेआउट के मापन पास को पुनर्नवीनीकरण दृश्य के AutoMeasure तंत्र का उपयोग करना चाहिए या यदि ऐसा करना है कि LayoutMager द्वारा onMeasure (पुनरावर्ती, राज्य, int, int) के कार्यान्वयन के लिए किया जाना चाहिए। यह विधि डिफ़ॉल्ट रूप से झूठी हो जाती है (यह वास्तव में हटाए गए सेटऑटो मेबरेंस इनेबल्ड (बूलियन) के लिए दिया गया मान लौटाता है और यह सच है कि अगर कोई लेआउट प्रबंधक Recycycline द्वारा मापा ऑटो होना चाहता है तो उसे वापस लौटने की अनुमति दी जानी चाहिए। यदि यह विधि सही वापस करने के लिए ओवरराइड की जाती है, तो ऑनमर्स (रिसाइकलर, स्टेट, इंट, इंट) को ओवरराइड नहीं किया जाना चाहिए।
पीटरस्टेव उर्ग्गबा

100

1) आपको ऊपर 23.2.0 (या) समर्थन पुस्तकालय का उपयोग करने की आवश्यकता है

2) और RecyclerViewऊंचाई होगी wrap_content

3) recyclerView.setNestedScrollingEnabled(false)

लेकिन ऐसा करने से रिसाइकलर पैटर्न काम नहीं करता है । (यानी सभी दृश्यों को एक बार में लोड किया जाएगा क्योंकि wrap_contentजरूरतों को पूरा करने की ऊंचाई RecyclerViewतो यह सब बच्चे आकर्षित करेगा Views at once. No view will be recycled). Try not to use this pattern unless it is really required. Try to useviewType and add all other views that need to scroll toRecyclerView rather than usingRecyclerView inScrollview`। प्रदर्शन प्रभाव बहुत अधिक हो जाएगा।

इसे सरल बनाने के लिए "यह LinearLayoutसभी बच्चे के विचारों के साथ काम करता है "


6
धन्यवाद @Ashok सेटिंग से recyclerView.setNestedScrollingEnabled(false)मुझे एक सुगम स्क्रॉल बनाने में मदद मिली।
शुभल

3
यह स्वीकृत उत्तर होना चाहिए! यह अच्छी तरह से इंगित करें कि कोई दृश्य पुनर्नवीनीकरण नहीं किया जाएगा और सभी दृश्य एक ही बार में तैयार किए जाएंगे।
M'hamed

3
@AshokVarma, अब मैं उसी मुद्दे का सामना कर रहा हूं। लेकिन स्क्रॉल recyclerView के अंदर ठीक काम कर रहा है, लेकिन मैं recyclerview के लिए एंडलेस स्क्रॉल को लागू नहीं कर सका। पुनर्नवीनीकरण के सभी दृश्य एक बार में आकर्षित होते हैं, इसलिए यह वेब सेवा को कॉल करते रहने की ओर जाता है। तो मैं इसे कैसे संभाल सकता हूं?
अनंत बाबू

@AnanthaBabu एक स्क्रॉलव्यू में recyclerview का उपयोग करने के बजाय। स्क्रॉलव्यू में सभी आइटम को पुनर्नवीनीकरण दृश्य में आइटम में कनवर्ट करें। आप विभिन्न प्रकार के लेआउट को पेंट करने के लिए रिसाइकलव्यू का उपयोग कर सकते हैं। इन्हें संभालने के लिए कुछ अच्छे पुस्तकालय हैं (यदि आप वास्तव में जटिल दृश्य संरचना और यदि आप पुन: प्रयोज्य घटक चाहते हैं तो पुस्तकालयों का उपयोग करें)।
अशोक वर्मा

1
@ एशोकवर्मा रिसाइकलर व्यवहार के मुद्दे का कोई समाधान है? मैं एक शॉट में सभी बच्चों को आकर्षित करने के लिए recyclerview नहीं चाहता।
ओरो-गर्ल

36

आप उपाय मापने के android:fillViewport="true"लिए उपयोग कर सकते हैं । शेष ऊंचाई भर जाएगा। इसलिए यदि आप स्क्रॉल करने के लिए चाहते हैं , तो आप सेट कर सकते हैं के ।NestedScrollViewRecyclerViewRecyclerViewNestScrollViewRecyclerViewminHeight


14
यदि आपके पास 200 वस्तुओं का एक पुनर्नवीनीकरण है और आप ऐसा करते हैं, तो पूरे 200 आइटम को भरने के लिए nestedscrollview का विस्तार होगा!
RJFares 20

1
@RJFares ऐसा कभी नहीं हुआ। मैं एक डेमो की कोशिश करता हूं और लेआउट का निरीक्षण करने के लिए LayoutInspector का उपयोग करता हूं, यह बस अच्छी तरह से काम करता है। क्या आप अपने recyclerView के संस्करण प्रदान कर सकते हैं?
zayn

26

बस खुद को जोड़ने recyclerView.setNestedScrollingEnabled(false);से पहले setAdapterमेरे लिए काम किया। मैंने app:layout_behavior="@string/appbar_scrolling_view_behavior"कहीं भी नहीं जोड़ा और किसी भी कस्टम लेआउट प्रबंधक को सेट नहीं किया

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                android:text="Some Text..."
                android:padding="15dp" />

        </LinearLayout>

        <LinearLayout
            android:orientation="vertical"
            android:padding="15dp"
            android:layout_marginTop="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Quick Links"
                android:textColor="@color/black"
                android:textStyle="bold"
                android:textAllCaps="true"
                android:paddingLeft="20dp"
                android:drawableLeft="@drawable/ic_trending_up_black_24dp"
                android:drawablePadding="10dp"
                android:layout_marginBottom="10dp"
                android:textSize="16sp"/>

            <View
                android:layout_width="fill_parent"
                android:layout_height="1dp"
                android:background="#efefef"/>

            <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/recyclerview"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>

    </LinearLayout>

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

10
लेकिन अब यह विचारों को रीसायकल नहीं करता है?
मार्क बुइकेमा

नहीं, यह रीसायकल करेगा, है ना?
विग्नेश सुंदर

6
नहीं, ऐसा नहीं है, मैंने 200 वस्तुओं के साथ एक बहुत ही जटिल लेआउट के साथ कोशिश की, नेस्ट्रोक्रोलव्यू सिर्फ अपने बच्चों के आकार तक फैलता है इसलिए इसका विस्तार होगा, इसलिए कोई रीसाइक्लिंग नहीं होगी @MarkBuikema क्या आपने एक बेहतर समाधान खोजने का प्रबंधन किया?
RJFares

20

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

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.v4.widget.NestedScrollView>

4
आप दूसरे ऐप को हटा सकते हैं : लेआउट_बेहवियर = "@ स्ट्रिंग / ऐपबार_कॉल्रोलिंग_व्यू_हैवियर" जैसा कि व्यवहार केवल कोऑर्डिनेटर लयआउट डायरेक्ट चिल्ड्स के लिए काम करता है।
पेप्स्टर

2
इसके अलावा, यह उल्लेख करना महत्वपूर्ण है कि आपके पास अपने रूट लेआउट के रूप में समन्वयक लेआउट होना चाहिए । यह हमेशा सच नहीं होता है।
गटकेट

10

एक सरल और परीक्षण कोड है जिसे आप देख सकते हैं

<android.support.v4.widget.NestedScrollView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fillViewport="true"
     app:layout_behavior="@string/appbar_scrolling_view_behavior">
    <android.support.v7.widget.RecyclerView
           android:layout_width="match_parent"
           android:layout_height="match_parent"/>
   </android.support.v4.widget.NestedScrollView>

9

के लिए androidxयह कहा जाता है androidx.core.widget.NestedScrollView- और यह भी गुण के साथ एक जैसे मक्खन स्क्रॉल isScrollContainerऔर measureAllChildrenसक्षम:

<!-- Scrolling Content -->
<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:isScrollContainer="true"
    android:measureAllChildren="true"

    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fastScrollEnabled="true"
        android:scrollbarStyle="insideInset"
        android:scrollbars="vertical"
        android:splitMotionEvents="false"
        android:verticalScrollbarPosition="right"/>

</androidx.core.widget.NestedScrollView>

7

इस लाइब्रेरी का उपयोग करने का प्रयास करें - https://github.com/sero/android-linear-layout-manager

लाइब्रेरी का लेआउटमैनेजर RecyclerView अपनी सामग्री लपेटता है। इस मामले में RecyclerView "आंतरिक दृश्यों जितना बड़ा" होगा, इसलिए इसमें स्क्रॉलबार नहीं होगा और उपयोगकर्ता NestedScrollView की स्क्रॉलिंग क्षमताओं का उपयोग करेगा। इसलिए, यह "स्क्रॉल करने योग्य अंदर स्क्रॉल करने योग्य" की तरह अस्पष्ट नहीं होगा।


1
यह इस लाइब्रेरी से LinearLayoutManager का वर्ग है: github.com/sero/android-linear-layout-manager/blob/master/lib/…
निंजा कोडिंग

6

यहाँ वह कोड है जिसका उपयोग मैं स्क्रॉलिंग मुद्दों से बचने के लिए कर रहा हूँ:

mRecyclerView = (RecyclerView) view.findViewById(android.R.id.list);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.getLayoutManager().setAutoMeasureEnabled(true);
mRecyclerView.setNestedScrollingEnabled(false);
mRecyclerView.setHasFixedSize(false);

6

मैंने एक NestedScrollView के अंदर RecyclerView का उपयोग किया और यह मेरे लिए काम करता है। मुझे केवल यही ध्यान रखना था कि NestedScrollView केवल एक बच्चा दृश्य लेता है। इसलिए मेरे मामले में मैंने LienearLayout व्यूग्रुप का उपयोग किया जो मेरे RecyclerView के साथ साथ कई अन्य दृश्य भी थे जिनकी मुझे ज़रूरत थी।

मुझे नेस्ट्सक्रॉलव्यू के अंदर अपना RecyclerView डालते हुए एक समस्या का अनुभव होता है। मैंने महसूस किया कि मेरे RecyclerView की सामग्री को स्क्रॉल करने से सुस्त हो गई।

मुझे बाद में पता चला कि मेरा RecyclerView स्क्रॉलिंग इवेंट प्राप्त कर रहा था और इसलिए NestedScrollView के स्क्रॉलिंग व्यवहार के साथ विरोध कर रहा था।

तो उस समस्या को हल करने के लिए, मुझे इस विधि के साथ अपने RecyclerView की स्क्रॉल कार्यक्षमता को अक्षम करना पड़ा movieListNewRecyclerView.setNestedScrollingEnabled(false);

आप मेरे इंस्टाग्राम को एक छोटी वीडियो के लिए चेकआउट कर सकते हैं जो मैंने वास्तव में किया था। यह मेरा इंस्टाग्राम हैंडल ofelix03 है

मैंने जो किया उसे देखने के लिए इस चित्र पर क्लिक करें


5

मेरे पास NestedScrollView के अंदर Viewpager और RecyclerView है। नीचे लाइनों को जोड़ने के बाद

recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);

मैंने धीमी स्क्रॉल और स्क्रॉल अंतराल समस्या हल की।


3
क्या आपका मतलब नहीं है recyclerView.setHasFixedSize(true);?
केनो क्लेटन

3

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


8
के बाद से RecyclerViewलागू करता NestedScrollingChild, RecyclerViewके माध्यम से स्क्रॉल किया जा करने के लिए सक्षम होना चाहिए NestedScrollView
बेंजामिन

मैंने केवल अंग्रेजी गलतियों पर आधारित stackoverflow.com/review/suggested-edits/9907622 को अस्वीकार करने के लिए मतदान किया था , लेकिन वहाँ मूल्य की सामग्री हो सकती है - विषय वस्तु के ज्ञान से गुजरने वाले किसी को भी देखना चाहिए और देखें कि क्या वे इसे साफ कर सकते हैं। अगर वहां कुछ भी उपयोगी नहीं है, तो मॉड द्वारा हटाने के लिए मेरी इस टिप्पणी को चिह्नित करें।
मार्क अमेरी

3

यदि आप उपयोग कर रहे हैं RecyclerView-23.2.1 या बाद में। निम्नलिखित समाधान ठीक काम करेगा:

अपने लेआउट में इस तरह RecyclerView जोड़ें:

<android.support.v7.widget.RecyclerView
        android:id="@+id/review_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical" />

और आपकी जावा फ़ाइल में:

RecyclerView mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager=new LinearLayoutManager(getContext());
layoutManager.setAutoMeasureEnabled(true);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setAdapter(new YourListAdapter(getContext()));

यहाँ layoutManager.setAutoMeasureEnabled(true);चाल चलेंगे।

की जाँच करें इस मुद्दे और इस डेवलपर ब्लॉग में अधिक जानकारी के लिए।


"MRecyclerView.setHasFixedSize (true);" का उपयोग करके सावधान रहें हालांकि। आप इसका उपयोग केवल तभी कर सकते हैं जब आप रनटाइम पर पुनर्नवीनीकरण दृश्य से आइटम नहीं जोड़ते या हटाते हैं।
गटकेट

2

रिसाइकलव्यू के पुनरावर्तन की सुविधा को बनाए रखने के लिए और अपने सभी डेटा को लोड करने के लिए रिसाइकलव्यू से बचने के लिए एक समाधान खुद रिसाइकलव्यू में एक ऊंचाई तय कर रहा है। ऐसा करने से recyclerview केवल लोड करने के लिए ही सीमित है क्योंकि इसकी ऊंचाई उपयोगकर्ता को इस प्रकार दिखा सकती है कि यदि आप नीचे / ऊपर स्क्रॉल करते हैं तो इसका तत्व पुनर्चक्रित कर सकते हैं।


2

बहुत सारे अच्छे जवाब हैं। कुंजी आप सेट करना होगा वह यह है कि nestedScrollingEnabledकरने के लिए false। जैसा कि ऊपर उल्लेख आप जावा कोड में कर सकते हैं:

mRecyclerView.setNestedScrollingEnabled(false);

लेकिन आपके पास xml कोड में एक ही प्रॉपर्टी सेट करने का अवसर भी है ( android:nestedScrollingEnabled="false"):

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

2

आप उपयोग कर रहे हैं RecyclerView ScrollListener अंदर NestedScrollView , addOnScrollListener श्रोता ठीक से काम नहीं करता है, तो आप दोनों का उपयोग किया जाता है।

इस कोड का उपयोग करें।

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

यह कोड काम कर रहा है ठीक NycScrollView के अंदर RecyclerView ScrollListener

धन्यवाद


1

मुझे टूलबार स्क्रॉलिंग के साथ कोऑर्डिनेटर लयआउट को लागू करना पड़ा और इसने मुझे दिन भर में गड़बड़ कर दिया। मैंने इसे NestedScrollView को बिल्कुल हटाकर काम कर लिया है। तो मैं बस मूल में RelativeLayout का उपयोग कर रहा हूँ।

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

</RelativeLayout>

1

NestedScrollView के अंदर recyclerView का उपयोग न करें। यह समस्या का कारण हो सकता है! मैं कई तरह के विचारों को संभालने के लिए RecyclerView में ItemViewTypes का उपयोग करने का सुझाव देता हूं। बस match_parent चौड़ाई और ऊंचाई के साथ एक RecyclerView जोड़ें। फिर अपने recyclerViewAdapter में getItemViewType को ओवरराइड करें और जो लेआउट को फुलाया जाए, उसे संभालने के लिए स्थिति का उपयोग करें। उसके बाद आप onBindViewHolder विधि का उपयोग करके अपने व्यू होल्डर को संभाल सकते हैं।


1
nestedScrollView.setNestedScrollingEnabled(true);

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            //...
        }
    });


<androidx.core.widget.NestedScrollView
    android:id="@+id/nested"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:layout_below="@id/appBarLayout_orders"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <androidx.constraintlayout.widget.ConstraintLayout ...

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>

0

मैंने इस भयानक एक्सटेंशन का इस्तेमाल किया है (कोटलिन में लिखा है लेकिन जावा में भी इस्तेमाल किया जा सकता है)

https://github.com/Widgetlabs/expedition-nestedscrollview

मूल रूप से आप NestedRecyclerViewकिसी भी पैकेज के अंदर मिलता है अपने प्रोजेक्ट में कहते हैं, तो बस अपने recyclerview की तरह बनाएँ

 <com.your_package.utils.NestedRecyclerView
      android:id="@+id/rv_test"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />

मार्क कन्नुप द्वारा इस भयानक लेख की जाँच करें

https://medium.com/widgetlabs-engineering/scrollable-nestedscrollviews-inside-recyclerview-ca65050d828a


0

नेस्टेड स्क्रॉल दृश्य में एक बार में सभी रीसायकल व्यू बच्चे को लोड न करने का समाधान

benfits:

  1. नेस्टेड स्क्रॉल दृश्य का उपयोग करते समय एक बार सभी बच्चों को लोड न करें।
  2. आप बेहतर प्रदर्शन के लिए recycleView.setHasFixedSize (सच) का उपयोग कर सकते हैं
  3. एक बार में सभी डेटा भेजने के लिए webservices को रोकना, उम्मीद के मुताबिक काम करता है
  4. बड़ी संख्या में डेटा सेट के लिए अच्छा है।
  5. कम मेमोरी डिवाइस के लिए अच्छा है
  6. नेस्टेड स्क्रॉलिंग का उपयोग जारी रख सकते हैं
  7. बहुत मददगार है जब आपके रीकॉल आइटम को जटिल देखते हैं और बहुत सारे संसाधनों की आवश्यकता होती है।

ठीक कर :

उपयोग करने के बजाए अपने xml में match_parent या wrap_content recycleview उपयोग के लिए ठीक ऊंचाई


-5

NiedScrollView के साथ RecyclerView

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