¿Cómo usar RecyclerView dentro de NestedScrollView?

210

¿Cómo usar RecyclerViewdentro NestedScrollView? RecyclerViewel contenido no es visible después de configurar el adaptador.

ACTUALIZACIÓN del código de diseño actualizado.

<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>
Mecida
fuente
@Mecid No hay razones para usar un RecyclerView dentro de un ScrollView (o NestedScrollView).
Gabriele Mariotti
2
@Mecid, nunca debe colocar una vista desplazable dentro de otra vista desplazable. Es una regla general en Android.
Gabriele Mariotti
66
@GabrieleMariotti, conozco esta regla, pero NestedScrollView se desarrolló para solucionar este problema.
Mecid
1
No es correcto. NestedScrollView es como ScrollView, pero admite actuar como un elemento principal de desplazamiento anidado y un elemento secundario. En su caso, debe definir su propio comportamiento de desplazamiento.
Gabriele Mariotti

Respuestas:

216

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

aquí,

app:layout_behavior="@string/appbar_scrolling_view_behavior"

gestionará el resto de las cosas.

Una cosa más, no es necesario poner su reciclador Ver dentro de NestedScrollView

Rahul Upadhyay
fuente
33
No puedo entender por qué esta solución no recibe la mayor cantidad de votos. No se logra con, NestedScrollViewsino solo con app:layout_behavior="@string/appbar_scrolling_view_behavior". Esta es la clave!
Hata
3
@RahulUpadhyay esto funcionó para mí, pero creo que su última línea está mal, el RecyclerView no se muestra si está dentro de un NestedScrollView. Sin embargo, eres una superestrella: D
Leon
3
¡Funciona! solo actualice la compilación de la biblioteca de la vista de reciclaje 'com.android.support:recyclerview-v7:+'
Fabio Guerra
28
Esta solución está destinada a ser utilizada con CoordinatorLayout, AppBarLayouty la configuración adecuada layout_scrollFlagsen la (s) vista (s) secundaria (s) que deben desplazarse con RecyclerView. No estoy seguro de por qué esto se omitió de la respuesta. De lo contrario, esta es una solución agradable y simple.
Sanvywell
9
Creo que es muy importante entender que el RECICLAJE de RecyclerView NO FUNCIONARÁ aquí. Como resultado, si tiene una larga lista de elementos, aparecerá con una congelación de IU notable.
Gaket
121

ACTUALIZACIÓN 1

Desde Android Support Library 23.2.0 se agregaron métodos setAutoMeasureEnabled(true)para LayoutManagers. Hace que RecyclerView ajuste su contenido y funciona de maravilla.
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

Así que solo agrega algo como esto:

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


ACTUALIZACIÓN 2

Dado que 27.1.0 setAutoMeasureEnabledestá en desuso, debe proporcionar una implementación personalizada de LayoutManager con un método anuladoisAutoMeasureEnabled()

Pero después de muchos casos de uso de RecyclerView, recomiendo no usarlo en modo envolvente , porque esto no es para lo que está destinado. Intente refactorizar todo su diseño usando RecyclerView normal con varios tipos de elementos. O utilice el enfoque con LinearLayout que describí a continuación como último recurso


Respuesta anterior (no recomendada)

Puedes usar RecyclerViewdentro NestedScrollView. En primer lugar, debe implementar su propia costumbre LinearLayoutManager, hace RecyclerViewque su contenido se ajuste. Por ejemplo:

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

Después de eso, use esto LayoutManagerpara suRecyclerView

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

Pero también debe llamar a esos dos métodos:

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

Aquí setNestedScrollingEnabled(false)deshabilita el desplazamiento para RecyclerView, por lo que no intercepta el evento de desplazamiento NestedScrollView. Y setHasFixedSize(false)determine que los cambios en el contenido del adaptador pueden cambiar el tamaño delRecyclerView

Nota importante: esta solución es un poco defectuosa en algunos casos y tiene problemas con el rendimiento, por lo que si tiene muchos elementos en su RecyclerViewrecomendaría utilizar una LinearLayoutimplementación personalizada de la vista de lista, cree un adaptador análogo y hágalo comportarse como ListViewoRecyclerView

smbd uknow
fuente
19
¡Precaución! No uses esto si tienes muchos artículos en tu RecyclerView.
Brais Gabin
1
@BraisGabin, tiene razón: setHasFixedSize (false) provoca una actualización múltiple de RecyclerView, por lo que si tiene muchos elementos, funcionará muy lentamente. En esos casos, uso LinearLayout con una especie de "adaptador" personalizado para que se comporte como ListView o RecyclerView
Smbd uknow
1
¡Muchas gracias! Me salvó horas. Por cierto, la decoración del último elemento no se muestra con este administrador de diseño (y solo con este), ¿posible error?
Jjang
2
setAutoMeasureEnabled está en desuso a partir del nivel de API 27.1.0 developer.android.com/reference/android/support/v7/widget/…
Dika
2
anular boolean isAutoMeasureEnabled () en su lugar. Devuelve si el paso de medición del diseño debe usar el mecanismo de AutoMeasure de RecyclerView o si debe hacerse mediante la implementación de onMeasure del LayoutManager (Recycler, State, int, int). Este método devuelve falso de forma predeterminada (en realidad, devuelve el valor pasado al setAutoMeasureEnabled (booleano) en desuso) y debe anularse para que devuelva verdadero si un LayoutManager desea que el RecyclerView lo mida automáticamente. Si se anula este método para devolver verdadero, onMeasure (Recycler, State, int, int) no debe anularse.
Peterstev Uremgba
100

1) Debe usar la biblioteca de soporte 23.2.0 (o) anterior

2) y la RecyclerViewaltura será wrap_content.

3) recyclerView.setNestedScrollingEnabled(false)

Pero al hacer esto, el patrón de reciclador no funciona . (es decir, todas las vistas se cargarán a la vez porque wrap_contentnecesita la altura completa RecyclerViewpara que dibuje todas las Views at once. No view will be recycled). Try not to use this pattern unless it is really required. Try to usevistas secundarias Tipo and add all other views that need to scroll toRecyclerView rather than usingRecyclerView inScrollview ". El impacto en el rendimiento será muy alto.

Para hacerlo simple "simplemente actúa como LinearLayout con todas las vistas secundarias"

Ashok Varma
fuente
66
Gracias @ Ashok. La configuración recyclerView.setNestedScrollingEnabled(false)me ayudó a tener un desplazamiento suave.
Shubhral
3
¡Esta debería ser la respuesta aceptada! porque señala bien que no se reciclará ninguna vista y se dibujará toda la vista a la vez.
M'hamed
3
@AshokVarma, mismo problema que estoy enfrentando ahora. pero scroll funciona bien dentro de recyclerView, pero no pude implementar Endless scroll para recyclerview porque todas las vistas de recyclerview dibujan a la vez, por lo que sigue llamando al servicio web. Entonces, ¿cómo puedo manejar esto?
Anantha Babu
@AnanthaBabu en lugar de usar la vista de reciclaje en una vista de desplazamiento. Convierta todos los elementos en la vista de desplazamiento a elementos en la vista de reciclador. puede usar el tipo de vista de vistas de reciclaje y pintar diferentes tipos de diseños. También hay algunas buenas bibliotecas para manejarlas (use bibliotecas si tiene una estructura de vista realmente complicada y si desea componentes reutilizables).
Ashok Varma
1
@AshokVarma ¿hay alguna solución para el problema del comportamiento del reciclador? No quiero que la vista de reciclaje atraiga a todos los niños de una sola vez.
andro-girl
36

Puedes usar android:fillViewport="true"para hacer NestedScrollViewmedir el RecyclerView. El RecyclerViewllenará la altura restante. así que si quieres desplazarte NestScrollView, puedes configurar el RecyclerView's minHeight.

zayn
fuente
14
Si tiene una vista de reciclaje de 200 artículos y hace esto, la vista de desplazamiento anidado se expandirá para llenar los 200 artículos completos.
RJFares
1
@RJFares Eso nunca sucedió. Intento una demostración y uso LayoutInspector para inspeccionar el diseño, simplemente funciona bien. ¿Puede proporcionar las versiones de su recyclerView?
zayn
26

Simplemente agregar recyclerView.setNestedScrollingEnabled(false);antes de setAdaptersí mismo funcionó para mí. No agregué ningún app:layout_behavior="@string/appbar_scrolling_view_behavior"lugar y no configuré ningún administrador de diseño personalizado

<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>
Vignesh Sundar
fuente
10
¿Pero ahora ya no recicla vistas?
Mark Buikema
No, se reciclará, ¿no?
Vignesh Sundar
66
no, no lo hice, intenté con un diseño muy complejo con 200 elementos, la vista de desplazamiento anidada solo se expande al tamaño de sus hijos para que se expanda, por lo tanto, no ocurrirá ningún reciclaje @ MarkBuikema ¿logró encontrar una solución mejor?
RJFares
20

Esto es lo que funciona para mi

<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>
Ness Tyagi
fuente
44
Puede eliminar la segunda aplicación: layout_behavior = "@ string / appbar_scrolling_view_behavior" Como el comportamiento solo funciona para los niños directos de CoordinatorLayout.
Pepster
2
Además, es importante mencionar que debe tener un diseño de Coordinador como su diseño raíz. No siempre es verdad.
Gaket
10

Hay un código simple y de prueba que puede verificar

<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>
Hakim Khan
fuente
9

Porque androidxse llama androidx.core.widget.NestedScrollView, y también se desplaza por igual mantequilla con propiedades isScrollContainery measureAllChildrenhabilitado:

<!-- 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>
Martin Zeitler
fuente
7

Intente utilizar esta biblioteca: https://github.com/serso/android-linear-layout-manager .

LayoutManager de la biblioteca hace que RecyclerView envuelva su contenido. En este caso, RecyclerView será "tan grande como las vistas internas", por lo que no tendrá barras de desplazamiento y el usuario utilizará las capacidades de desplazamiento de NestedScrollView. Por lo tanto, no será ambiguo como "desplazable dentro de desplazable".

alcsan
fuente
1
Esta es la clase de LinearLayoutManager de esta biblioteca: github.com/serso/android-linear-layout-manager/blob/master/lib/…
Ninja Coding
6

Aquí está el código que estoy usando para evitar problemas de desplazamiento:

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

Solía RecyclerView dentro de un NestedScrollView y funcionó para mí. El único problema que tuve que tener en cuenta fue que un NestedScrollView solo toma una vista secundaria. Entonces, en mi caso, utilicé el grupo de vista LienearLayout que albergaba mi RecyclerView más una cantidad de otras vistas que necesitaba.

Experimento un problema al colocar mi RecyclerView dentro de NestedScrollView. Me di cuenta de que desplazar el contenido de mi RecyclerView se aflojó.

Más tarde me di cuenta de que mi RecyclerView estaba recibiendo el evento de desplazamiento y, por lo tanto, estaba en conflicto con el comportamiento de desplazamiento de NestedScrollView.

Entonces, para resolver ese problema, tuve que deshabilitar la funcionalidad de desplazamiento de mi RecyclerView con este método movieListNewRecyclerView.setNestedScrollingEnabled(false);

Puedes ver mi Instagram para ver un video corto de lo que realmente hice. Este es mi identificador de instagram ofelix03

Haga clic en esta imagen para ver lo que hice.

Felix Otoo
fuente
5

Tengo Viewpager y RecyclerView dentro de NestedScrollView. Después de agregar las siguientes líneas

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

Resolví el problema de desplazamiento lento y retraso de desplazamiento.

Isham
fuente
3
No quiere decir recyclerView.setHasFixedSize(true);?
Keno Clayton
3

No puede usar una vista de reciclador dentro de una vista de desplazamiento anidada. No está destinado a contener más vistas desplazables, pero es porque es un elemento secundario de un diseño de desplazamiento en sí mismo que necesita la vista de desplazamiento anidada. Tuve el mismo problema, pero al final moví mi vista de texto para que fuera una vista de encabezado dentro de la vista de reciclaje, hice que la vista de reciclaje fuera un elemento directo del diseño del coordinador y eliminé la vista de desplazamiento anidada. Entonces todos mis problemas se fueron.

Barry Irvine
fuente
8
Desde RecyclerViewimplementos NestedScrollingChild, RecyclerViewdebe poder desplazarse a través de NestedScrollView.
Benjamin
Acabo de votar para rechazar stackoverflow.com/review/suggested-edits/9907622 basándome únicamente en los errores en inglés, pero puede haber contenido de valor allí, cualquiera que pase con conocimiento del tema debería echar un vistazo y ver si puede limpiarlo Si no hay nada útil allí, marque este comentario mío para que lo eliminen los mods.
Mark Amery
3

Si está utilizando RecyclerView-23.2.1o más tarde. La siguiente solución funcionará bien:

En su diseño, agregue RecyclerView así:

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

Y en tu archivo 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()));

aquí layoutManager.setAutoMeasureEnabled(true); hará el truco.

Consulte este problema y este blog de desarrolladores para obtener más información.

uniruddh
fuente
Tenga cuidado al usar "mRecyclerView.setHasFixedSize (true);" aunque. Puede usarlo solo si no agrega o elimina elementos de la vista del reciclador en tiempo de ejecución.
Gaket
2

Una solución para mantener la función de reciclaje de la vista de reciclaje y evitar que la vista de reciclaje cargue todos sus datos es establecer una altura fija en la vista de reciclaje. Al hacer esto, la vista del reciclador se limita solo a cargar tanto como su altura pueda mostrar al usuario, reciclando así su elemento si alguna vez se desplaza hacia abajo / arriba.

Christian Callelero
fuente
2

Hay muchas buenas respuestas. La clave es que se debe ajustar nestedScrollingEnableda false. Como se mencionó anteriormente, puede hacerlo en código java:

mRecyclerView.setNestedScrollingEnabled(false);

Pero también tiene la oportunidad de establecer la misma propiedad en el código 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" />
Alex Misiulia
fuente
2

Si está utilizando RecyclerView ScrollListener dentro de NestedScrollView , addOnScrollListener oyente no funciona correctamente si se utilizan ambos.

Usa este código.

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

este código funciona bien RecyclerView ScrollListener dentro de NestedScrollView .

Gracias

Rahul
fuente
1

Tuve que implementar CoordinatorLayout con el desplazamiento de la barra de herramientas y me llevó todo el día jugar con esto. Lo tengo funcionando eliminando NestedScrollView en absoluto. Así que solo estoy usando RelativeLayout en la raíz.

<?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>
Bogdan Ustyak
fuente
1

no use recyclerView dentro de NestedScrollView. ¡Puede causar problemas en cascada! Sugiero usar ItemViewTypes en RecyclerView para manejar múltiples tipos de vistas. simplemente agregue un RecyclerView con match_parent ancho y alto. luego, en su recyclerViewAdapter, anule getItemViewType y use la posición para manejar qué diseño se inflará. después de eso, puede manejar su soporte de vista utilizando el método onBindViewHolder.

Hossein Karami
fuente
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"/>
Braian Coronel
fuente
0

He usado esta increíble extensión (escrita en kotlin pero también se puede usar en Java)

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

Básicamente obtienes el NestedRecyclerViewinterior de cualquier paquete, digamos utilidades en tu proyecto, luego simplemente crea tu vista de reciclador como

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

Mira este impresionante artículo de Marc Knaup

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

Gastón Saillén
fuente
0

Solución para no cargar todos los elementos secundarios de la vista de reciclaje a la vez dentro de la vista de desplazamiento anidada .

Beneficios:

  1. no cargue todo el elemento secundario una vez, cuando use la vista de desplazamiento anidado
  2. puede usar recycleView.setHasFixedSize (true) para un mejor rendimiento
  3. evitar que los servicios web envíen todos los datos a la vez, la paginación funciona como se esperaba
  4. bueno para un mayor número de conjuntos de datos.
  5. bueno para dispositivos con poca memoria
  6. puede continuar haciendo uso del desplazamiento anidado
  7. muy útil cuando su objeto de visualización de recyle es complejo y requiere muchos recursos.

Reparar :

en su xml en lugar de usar match_parent o wrap_content para recycleview use fix height .

Abhishek Garg
fuente
0

Para mi caso, el hijo de NestedScrollview es ConstraintLayout. No funciona como se esperaba, lo reemplacé por LinearLayout. Quizás ayude a alguien.

<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>
nAkhmedov
fuente
-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" />
devangi chhatbar
fuente