¿Cómo usar RecyclerView dentro de NestedScrollView?

¿Cómo usar RecyclerView dentro de NestedScrollView ? RecyclerView contenido de RecyclerView no está visible después de configurar el adaptador.

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

         

Reemplace su recyclerView con,

  

aquí,

 app:layout_behavior="@string/appbar_scrolling_view_behavior" 

administrará el rest de las cosas.

Una cosa más, no hay necesidad de poner su recyclerView dentro de NestedScrollView

ACTUALIZAR

Desde Android Support Library 23.2.0, se agregó el método setAutoMeasureEnabled(true) para LayoutManagers. Hace RecyclerView para envolver su contenido y funciona como un encanto.
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

Así que solo agregue algo como esto:

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

Respuesta anterior (no recomendada)

Puede usar RecyclerView dentro de NestedScrollView . En primer lugar, debe implementar su propio LinearLayoutManager personalizado, que hace que su RecyclerView envuelva su contenido. 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 usa este LayoutManager para tu RecyclerView

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

Pero también debes llamar 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 desde NestedScrollView . Y setHasFixedSize(false) determina que los cambios en el contenido del adaptador pueden cambiar el tamaño de RecyclerView

Nota importante: esta solución es un poco defectuosa en algunos casos y tiene problemas de rendimiento, por lo que si tiene muchos elementos en su RecyclerView , le recomendaría utilizar la implementación personalizada de la vista de lista LinearLayout , crear un adaptador analógico para él y hacer que se comporte como ListView o RecyclerView

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

2) y la altura de RecyclerView será wrap_content .

3) recyclerView.setNestedScrollingEnabled(false)

Pero al hacer esto, el patrón de reciclado no funciona. (es decir, todas las vistas se cargarán a la vez porque wrap_content necesita la altura de RecyclerView completa para que dibuje todas las View secundarias a la vez. No se reciclará ninguna vista). Trate de no utilizar este patrón de utilidad a menos que realmente se requiera. Intente utilizar viewType y agregue todas las demás vistas que necesite desplazarse a RecyclerView lugar de utilizar RecyclerView en Scrollview . El impacto en el rendimiento será muy alto.

Para hacerlo simple, “simplemente actúa como LinearLayout con todas las vistas secundarias”

Puede usar android:fillViewport="true" para hacer que NestedScrollView mida RecyclerView . The RecyclerView llenará la altura restante. así que si desea desplazar el NestScrollView , puede configurar el NestScrollView RecyclerView .

Simplemente agregue recyclerView.setNestedScrollingEnabled(false); antes de que setAdapter funcionase para mí. No app:layout_behavior="@string/appbar_scrolling_view_behavior" ninguna parte y no configuré ningún administrador de diseño personalizado

             

Esto es lo que funciona para mí

    

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

LayoutManager de la biblioteca hace que RecyclerView envuelva sus contenidos. 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”.

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

    

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

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

Experimento un problema al colocar mi RecyclerView dentro de NestedScrollView. Me di cuenta de que el desplazamiento del contenido de mi RecyclerView estaba flojo.

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

Puede consultar mi Instagram para ver un video corto de lo que realmente hice. Este es mi identificador de Instagram deelix03

Haga clic en esta imagen para ver lo que hice

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

En su diseño, agregue RecyclerView de la siguiente manera:

  

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 y este blog de desarrollador para obtener más información.

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

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

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

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í 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 revista recycler, hice que la revista recyclerviejera fuera un elemento directo del diseño del coordinador y eliminé la vista de desplazamiento anidada. Entonces todos mis problemas desaparecieron.

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

     

RecyclerView con NestedScrollView