Come usare RecyclerView in NestedScrollView?


210

Come usare RecyclerViewdentro NestedScrollView? RecyclerViewil contenuto non è visibile dopo aver impostato l'adattatore.

AGGIORNAMENTO codice layout aggiornato.

<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 Non ci sono ragioni per usare un RecyclerView all'interno di un ScrollView (o NestedScrollView).
Gabriele Mariotti,

2
@Mecido non dovresti mai mettere una vista scorrevole all'interno di un'altra vista scorrevole. È una regola generale in Android.
Gabriele Mariotti,

6
@GabrieleMariotti Conosco questa regola, ma NestedScrollView è stato sviluppato per risolvere questo problema.
Mecid,

1
Non è corretto. NestedScrollView è proprio come ScrollView, ma supporta la funzione di padre e figlio a scorrimento nidificato. Nel tuo caso devi definire il tuo comportamento di scorrimento.
Gabriele Mariotti,

Risposte:


216

Sostituisci il tuo recyclerView con,

<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" />

Qui,

app:layout_behavior="@string/appbar_scrolling_view_behavior"

gestirà il resto delle cose.

Ancora una cosa, non è necessario inserire recyclerView in NestedScrollView


33
Non riesco a capire perché questa soluzione non ottenga il massimo dei voti. Non si ottiene con NestedScrollViewma solo con app:layout_behavior="@string/appbar_scrolling_view_behavior". Questa è la chiave!
hata,

3
@RahulUpadhyay ha funzionato per me, ma penso che la tua ultima riga sia sbagliata, RecyclerView non mostra affatto se si trova all'interno di NestedScrollView. Tuttavia, sei una superstar: D
Leon,

3
Funziona! basta aggiornare la libreria di recyclerview compilare 'com.android.support:recyclerview-v7:+'
Fabio Guerra,

28
Questa soluzione deve essere utilizzata con CoordinatorLayout, AppBarLayoute l'impostazione appropriata layout_scrollFlagsnella vista / e figlio / i che dovrebbe essere fatta scorrere con RecyclerView. Non sono sicuro del motivo per cui questo è stato omesso dalla risposta. Altrimenti, questa è una soluzione piacevole e semplice.
Sanvywell,

9
Penso che sia molto importante capire che il RICICLAGGIO di RecyclerView NON FUNZIONA qui. Di conseguenza, se si dispone di un lungo elenco di elementi, questo verrà visualizzato con un notevole blocco dell'interfaccia utente.
Gaket,

121

AGGIORNAMENTO 1

Dalla libreria di supporto Android 23.2.0 sono stati aggiunti metodi setAutoMeasureEnabled(true)per LayoutManager. Fa sì che RecyclerView racchiuda il suo contenuto e funzioni come un fascino.
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

Quindi aggiungi qualcosa di simile a questo:

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


AGGIORNAMENTO 2

Poiché 27.1.0 setAutoMeasureEnabledè obsoleto, è necessario fornire un'implementazione personalizzata di LayoutManager con metodo ignoratoisAutoMeasureEnabled()

Ma dopo molti casi di utilizzo RecyclerView consiglio vivamente di non usarlo in modalità wrapping , perché questo non è quello a cui è destinato. Prova a rielaborare l'intero layout utilizzando il normale RecyclerView singolo con diversi tipi di elementi. Oppure usa l'approccio con LinearLayout che ho descritto di seguito come ultima risorsa


Vecchia risposta (non consigliata)

Puoi usare RecyclerViewdentro NestedScrollView. Prima di tutto dovresti implementare la tua personalizzazione LinearLayoutManager, ti fa RecyclerViewavvolgere il suo contenuto. Per esempio:

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);
    }
}

Dopodiché usalo LayoutManagerper il tuoRecyclerView

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

Ma dovresti anche chiamare questi due metodi:

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

Qui setNestedScrollingEnabled(false)disabilita lo scorrimento per RecyclerView, quindi non intercetta l'evento di scorrimento da NestedScrollView. E setHasFixedSize(false)determinare che le modifiche al contenuto dell'adattatore possono cambiare la dimensione diRecyclerView

Nota importante: in alcuni casi questa soluzione è un po 'buggy e presenta problemi di prestazioni, quindi se hai molti elementi nel tuo RecyclerViewconsiglio di utilizzare l' LinearLayoutimplementazione personalizzata della vista elenco, creare un analogo di Adapter per esso e renderlo comportarsi come ListViewoRecyclerView


19
Attenzione! Non usarlo se hai molti oggetti nel tuo RecyclerView.
Brais Gabin,

1
@BraisGabin, hai ragione: setHasFixedSize (false) provoca un aggiornamento multiplo di RecyclerView, quindi se ha molti elementi, funzionerà molto lentamente. In quei casi uso LinearLayout con una sorta di "adattatore" personalizzato per farlo funzionare come ListView o RecyclerView
smbd uknow

1
Molte grazie! Mi ha salvato ore. A proposito, l'ultima decorazione dell'oggetto non viene visualizzata con questo gestore di layout (e solo con questo), possibile bug?
Jjang,

2
setAutoMeasureEnabled è obsoleto a partire dal livello API 27.1.0 developer.android.com/reference/android/support/v7/widget/…
Dika

2
sostituisce invece il valore booleano isAutoMeasureEnabled (). Indica se il passaggio di misurazione del layout deve utilizzare il meccanismo AutoMeasure di RecyclerView o se deve essere eseguito dall'implementazione di onMeasure (Recycler, State, int, int) del LayoutManager. Questo metodo restituisce false per impostazione predefinita (restituisce effettivamente il valore passato a setAutoMeasureEnabled obsoleto (booleano)) e deve essere sovrascritto per restituire true se un LayoutManager desidera essere misurato automaticamente da RecyclerView. Se questo metodo viene ignorato per restituire true, onMeasure (Recycler, State, int, int) non deve essere ignorato.
Peterstev Uremgba,

100

1) È necessario utilizzare la libreria di supporto 23.2.0 (o) sopra

2) e l' RecyclerViewaltezza saràwrap_content .

3) recyclerView.setNestedScrollingEnabled(false)

Ma facendo questo il modello di riciclaggio non funziona . (vale a dire che tutte le viste verranno caricate in una sola volta perché wrap_contentnecessita dell'altezza completa in RecyclerViewmodo da disegnare tutte le Views at once. No view will be recycled). Try not to use this pattern unless it is really required. Try to useviste secondarie Tipo and add all other views that need to scroll toRecyclerView rather than usingRecyclerView inScrollview`. L'impatto sulle prestazioni sarà molto elevato.

Per semplificare "agisce come LinearLayoutcon tutte le viste figlio"


6
Grazie @Ashok. L'impostazione recyclerView.setNestedScrollingEnabled(false)mi ha aiutato ad avere una pergamena fluida.
Shubhral,

3
Questa dovrebbe essere la risposta accettata! perché è bene sottolineare che nessuna vista verrà riciclata e tutta la vista verrà disegnata contemporaneamente.
M'hamed,

3
@AshokVarma, stesso problema che sto affrontando ora. ma scroll sta funzionando bene all'interno di recyclerView ma non ho potuto implementare lo scorrimento infinito per recyclerview perché tutte le viste dei disegni di recyclerview sono contemporaneamente in modo da continuare a chiamare il servizio web. quindi come posso gestirlo?
Anantha Babu il

@AnanthaBabu invece di utilizzare recyclerview in una vista di scorrimento. converte tutti gli elementi nella vista di scorrimento in elementi nella vista Riciclatore. è possibile utilizzare il tipo di vista recyclervview e dipingere diversi tipi di layout. Esistono anche alcune buone librerie per gestirle (utilizzare le librerie se si dispone di una struttura di visualizzazione davvero complicata e se si desidera utilizzare componenti riutilizzabili).
Ashok Varma,

1
@AshokVarma c'è qualche soluzione per il problema del comportamento del riciclatore? Non voglio recyclerview per attirare tutti i bambini in un colpo solo.
andro-girl,

36

Puoi usare android:fillViewport="true"per NestedScrollViewmisurare il RecyclerView. Il RecyclerViewriempirà l'altezza rimanente. quindi se si desidera scorrere NestScrollView, è possibile impostare RecyclerView's minHeight.


14
se hai una riciclerview di 200 articoli e lo fai, la finestra nestedscroll si espanderà per riempire gli interi 200 oggetti!
RJFares

1
@RJFares Non è mai successo. Provo una demo e utilizzo LayoutInspector per ispezionare il layout, funziona bene. Potete fornire le versioni del vostro recyclerView?
zayn,

26

L'aggiunta semplicemente recyclerView.setNestedScrollingEnabled(false);prima di setAdapterse stessa ha funzionato per me. Non ho aggiunto da app:layout_behavior="@string/appbar_scrolling_view_behavior"nessuna parte e non ho impostato alcun gestore di layout personalizzato

<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
Ma ora non ricicla più le viste?
Mark Buikema,

No, riciclerà, no?
Vignesh Sundar,

6
no, ho provato con un layout molto complesso con 200 articoli che nestedscrollview si espande alle dimensioni dei suoi figli, quindi si espanderà, quindi non avverrà alcun riciclaggio @MarkBuikema sei riuscito a trovare una soluzione migliore?
RJFares

20

Questo è ciò che funziona per me

<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
Puoi rimuovere la seconda app: layout_behavior = "@ string / appbar_scrolling_view_behavior" Poiché il comportamento funziona solo per i figli diretti di CoordinatorLayout.
Pepster,

2
Inoltre, è importante ricordare che è necessario disporre del layout del coordinatore come layout principale. Non è sempre vero.
Gaket,

10

Esiste un codice semplice e di prova che puoi verificare

<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

Perché androidxsi chiama androidx.core.widget.NestedScrollView- e scorre anche allo stesso modo burro con proprietà isScrollContainere measureAllChildrenabilitato:

<!-- 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

Prova a utilizzare questa libreria - https://github.com/serso/android-linear-layout-manager .

LayoutManager della libreria rende RecyclerView a capo del suo contenuto. In questo caso RecyclerView sarà "grande quanto le viste interne", quindi non avrà barre di scorrimento e l'utente utilizzerà le capacità di scorrimento di NestedScrollView. Pertanto, non sarà ambiguo come "scorrevole dentro scorrevole".


1
Questa è la classe di LinearLayoutManager da questa libreria: github.com/serso/android-linear-layout-manager/blob/master/lib/…
Ninja Coding

6

Ecco il codice che sto usando per evitare problemi di scorrimento:

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

6

Ho usato RecyclerView all'interno di un NestedScrollView e ha funzionato per me. L'unica cosa da tenere a mente era che un NestedScrollView utilizza solo una vista figlio. Quindi nel mio caso ho usato il viewgroup LienearLayout che ospitava il mio RecyclerView più una serie di altre visualizzazioni di cui avevo bisogno.

Riscontro un problema durante l'inserimento di RecyclerView in NestedScrollView. Mi sono reso conto che lo scorrimento del contenuto del mio RecyclerView è rallentato.

In seguito mi sono reso conto che il mio RecyclerView stava ricevendo l'evento di scorrimento e quindi era in conflitto con il comportamento di scorrimento di NestedScrollView.

Quindi, per risolvere questo problema, ho dovuto disabilitare la funzionalità di scorrimento del mio RecyclerView con questo metodo movieListNewRecyclerView.setNestedScrollingEnabled(false);

Puoi controllare il mio Instagram per un breve video di ciò che ho effettivamente fatto. Questa è la mia maniglia instagram ofelix03

Fai clic su questa immagine per vedere cosa ho fatto


5

Ho Viewpager e RecyclerView all'interno di NestedScrollView. Dopo aver aggiunto le righe di seguito

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

Ho risolto il problema dello scorrimento lento e del ritardo dello scorrimento.


3
Non intendi recyclerView.setHasFixedSize(true);?
Keno Clayton,

3

Non è possibile utilizzare una vista di riciclaggio all'interno di una vista di scorrimento nidificata. Non è destinato a contenere ulteriori viste scorrevoli ma è perché è figlio di un layout di scorrimento stesso che è necessaria la vista di scorrimento nidificata. Ho avuto lo stesso problema, ma alla fine ho spostato la mia vista di testo in modo che fosse una vista frontale all'interno della vista riciclo, ho reso la vista riciclo un figlio diretto del layout del coordinatore ed ho eliminato la vista scorrimento nidificata. Quindi tutti i miei problemi erano spariti.


8
Dal momento che gli RecyclerViewattrezzi NestedScrollingChild, RecyclerViewdovrebbero essere in grado di scorrere NestedScrollView.
Benjamin,

Ho appena votato per rifiutare stackoverflow.com/review/suggested-edits/9907622 basato esclusivamente sugli errori inglesi, ma potrebbe esserci contenuto di valore lì dentro - chiunque passi di lì con conoscenza dell'argomento dovrebbe dare un'occhiata e vedere se può ripulirlo. Se non c'è nulla di utile lì, segnala questo mio commento per la cancellazione da parte delle mod.
Mark Amery,

3

Se stai usando RecyclerView-23.2.1 o più tardi. La seguente soluzione funzionerà perfettamente:

Nel tuo layout aggiungi RecyclerView in questo modo:

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

E nel tuo file java:

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()));

Qui layoutManager.setAutoMeasureEnabled(true); farà il trucco.

Dai un'occhiata a questo problema e al blog degli sviluppatori per ulteriori informazioni.


Fai attenzione usando "mRecyclerView.setHasFixedSize (true);" anche se. Puoi usarlo solo se non aggiungi o rimuovi oggetti dalla vista del riciclatore in fase di esecuzione.
Gaket,

2

Una soluzione per mantenere la funzione di riciclaggio della vista riciclata ed evitare che la vista riciclata carichi tutti i dati è impostare un'altezza fissa nella vista riciclata stessa. In questo modo il recyclerview si limita a caricare solo quanto la sua altezza può mostrare all'utente, riciclando così il suo elemento se mai si scorre verso il basso / in alto.


2

Ci sono molte buone risposte. La chiave è che è necessario impostare nestedScrollingEnableda false. Come menzionato sopra puoi farlo nel codice java:

mRecyclerView.setNestedScrollingEnabled(false);

Ma hai anche l'opportunità di impostare la stessa proprietà nel codice 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

Se si utilizza RecyclerView ScrollListener in NestedScrollView , il listener addOnScrollListener non funziona correttamente se si utilizzano entrambi.

Usa questo codice

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

questo codice funziona correttamente RecyclerView ScrollListener all'interno di NestedScrollView .

Grazie


1

Ho dovuto implementare CoordinatorLayout con lo scorrimento della barra degli strumenti e mi ci è voluto tutto il giorno a scherzare su questo. Ho funzionato rimuovendo NestedScrollView affatto. Quindi sto solo usando RelativeLayout alla radice.

<?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

non utilizzare recyclerView in NestedScrollView. potrebbe causare problemi a cascata! Suggerisco di usare ItemViewTypes in RecyclerView per gestire più tipi di visualizzazioni. basta aggiungere un RecyclerView con larghezza e altezza match_parent. quindi nel tuo recyclerViewAdapter sovrascrivi getItemViewType e usa la posizione per gestire il layout da gonfiare. successivamente puoi gestire il tuo view view usando il metodo 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

Ho usato questa fantastica estensione (scritta in kotlin ma può essere usata anche in Java)

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

Fondamentalmente ottieni l' NestedRecyclerViewinterno di qualsiasi pacchetto, ad esempio utils nel tuo progetto, quindi crea il tuo recyclerview come

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

Dai un'occhiata a questo fantastico articolo di Marc Knaup

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


0

Soluzione per non caricare tutta la vista riciclata figlio contemporaneamente nella vista di scorrimento nidificata .

benfits:

  1. non caricare tutto il figlio una volta, quando si utilizza la vista di scorrimento nidificata.
  2. è possibile utilizzare recycleView.setHasFixedSize (true) per prestazioni migliori
  3. impedire ai servizi web di inviare tutti i dati contemporaneamente, l'impaginazione funziona come previsto
  4. buono per un numero maggiore di set di dati.
  5. buono per dispositivi a memoria insufficiente
  6. può continuare a utilizzare lo scorrimento nidificato
  7. molto utile quando il tuo recyle visualizza un oggetto complesso e richiede molte risorse.

Correzione:

nel tuo xml invece di usare match_parent o wrap_content per recycleview usa altezza correzione .


0

Nel mio caso, il figlio di NestedScrollview è ConstraintLayout. Non funziona come previsto l'ho sostituito a LinearLayout. Forse aiuta qualcuno.

<androidx.core.widget.NestedScrollView 
  android:id="@+id/nestedScrollView" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent">

  <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:descendantFocusability="blocksDescendants">

    <androidx.recyclerview.widget.RecyclerView
      android:id="@+id/recyclerView"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:nestedScrollingEnabled="false"
      app:layout_constraintBottom_toTopOf="@+id/divider"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toBottomOf="@+id/tinTitle"/>

  </LinearLayout>
</androidx.core.widget.NestedScrollView>

-5

RecyclerView con NestedScrollView

    <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" />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.