Estoy tratando de implementar un diseño que contenga RecyclerView y ScrollView en el mismo diseño.
Plantilla de diseño:
<RelativeLayout>
<ScrollView android:id="@+id/myScrollView">
<unrelated data>...</unrealated data>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/my_recycler_view"
/>
</ScrollView>
</RelativeLayout>
Problemas: puedo desplazarme hasta el último elemento de ScrollView
Cosas que probé:
- vista de tarjeta dentro de
ScrollView(ahoraScrollViewcontieneRecyclerView): puede ver la tarjeta hastaRecyclerView - El pensamiento inicial era implementar esto
viewGroupusando enRecyclerViewlugar deScrollViewdonde una de sus vistas es el tipoCardViewpero obtuve exactamente los mismos resultados que con elScrollView

NestedScrollViewen su lugar, ya que maneja muchos problemas de desplazamientoNestedScrollViewlugar de aScrollView. Para eso es exactamente.Respuestas:
usar en
NestedScrollViewlugar deScrollViewConsulte el documento de referencia NestedScrollView para obtener más información.
y añadir
recyclerView.setNestedScrollingEnabled(false);a tuRecyclerViewfuente
android:layout_height="wrap_content"para el diseño inflado para ViewHolderNestedScrollViewretrasa para mí, a diferencia delScrollView. Buscando una solución sin usarNestedScrollViewSé que llegué tarde al juego, pero el problema aún existe incluso después de que Google haya solucionado el problema
android.support.v7.widget.RecyclerViewLa cuestión ahora es consigo
RecyclerViewconlayout_height=wrap_contentno tomar la altura de todos los elementos en el interior temaScrollViewque solamente ocurre en las versiones de malvavisco y Turrón + (API 23, 24, 25).(ACTUALIZACIÓN: Reemplazar
ScrollViewconandroid.support.v4.widget.NestedScrollViewtrabajos en todas las versiones. De alguna manera me perdí la prueba de la solución aceptada . Agregué esto en mi proyecto github como demostración).Después de probar cosas diferentes, he encontrado una solución que soluciona este problema.
Aquí está mi estructura de diseño en pocas palabras:
La solución es la envoltura
RecyclerViewconRelativeLayout. ¡No me pregunten cómo encontré esta solución!¯\_(ツ)_/¯El ejemplo completo está disponible en el proyecto GitHub : https://github.com/amardeshbd/android-recycler-view-wrap-content
Aquí hay un screencast de demostración que muestra la solución en acción:
fuente
Aunque la recomendación de que
Es un buen consejo, sin embargo, si establece una altura fija en la vista del reciclador, debería funcionar bien.
Si conoce la altura del diseño del elemento del adaptador, puede calcular la altura de RecyclerView.
fuente
adapterItemSizevariable?En caso de que configurar la altura fija para RecyclerView no funcione para alguien (como yo), esto es lo que he agregado a la solución de altura fija:
fuente
La nueva Biblioteca de soporte de Android 23.2 resuelve ese problema, ahora puede establecer wrap_content como la altura de su
RecyclerViewy funciona correctamente.Biblioteca de soporte de Android 23.2
fuente
Las RecyclerViews están bien para ponerlas en ScrollViews siempre que no se desplacen por sí mismas. En este caso, tiene sentido hacerlo a una altura fija.
La solución adecuada es usar
wrap_contentla altura de RecyclerView y luego implementar un LinearLayoutManager personalizado que pueda manejar adecuadamente el ajuste.Copie este LinearLayoutManager en su proyecto: https://github.com/serso/android-linear-layout-manager/blob/master/lib/src/main/java/org/solovyev/android/views/llm/LinearLayoutManager.java
Luego envuelva el RecyclerView:
Y configúrelo así:
Editar: Esto puede causar complicaciones con el desplazamiento porque RecyclerView puede robar los eventos táctiles de ScrollView. Mi solución fue simplemente deshacerme de RecyclerView en su totalidad e ir con un LinearLayout, inflar subvistas programáticamente y agregarlos al diseño.
fuente
Para
ScrollView, puede usarfillViewport=truey hacerlayout_height="match_parent"lo siguiente y poner dentro la vista de reciclador:No se necesitan más ajustes de altura a través del código.
fuente
Calcular
RecyclerViewla altura de forma manual no es bueno, mejor es usar una costumbreLayoutManager.El motivo de su emisión por encima de cualquier punto de vista es el que tiene su desplazamiento (
ListView,GridView,RecyclerView) no calculó su altura cuando complemento como un niño en otro punto de vista tiene de desplazamiento. Por lo tanto, anular suonMeasuremétodo resolverá el problema.Reemplace el administrador de diseño predeterminado con el siguiente:
fuente
Prueba esto. Muy tarde respuesta. Pero seguramente ayudaré a cualquiera en el futuro.
Establezca su Scrollview en NestedScrollView
En su Recyclerview
fuente
ACTUALIZACIÓN: esta respuesta está desactualizada ahora ya que hay widgets como NestedScrollView y RecyclerView que admiten desplazamiento anidado.
¡nunca debe poner una vista desplazable dentro de otra vista desplazable!
le sugiero que haga su vista de reciclador de diseño principal y ponga sus vistas como elementos de la vista de reciclador.
Eche un vistazo a este ejemplo, que muestra cómo usar varias vistas dentro del adaptador de vista de reciclador. enlace al ejemplo
fuente
Si coloca
RecyclerViewdentroNestedScrollViewy habilitarecyclerView.setNestedScrollingEnabled(false);, el desplazamiento funcionará bien .Sin embargo, hay un problema.
Por ejemplo, su
RecyclerView(dentroNestedScrollViewoScrollView) tiene 100 elementos.Cuando se
Activityinicie, se crearán 100 elementos (onCreateViewHoldery seonBindViewHolderinvocarán 100 elementos al mismo tiempo).Ejemplo, para cada elemento, cargará una imagen grande desde API => actividad creada -> se cargará 100 imágenes.
Hace que la actividad de inicio sea lenta y retrasada.
Posible solución :
- Pensando en usar
RecyclerViewcon múltiples tipos.Sin embargo, si en su caso, solo hay unos pocos elementos
RecyclerViewy recicla o no recicla no afecta mucho el rendimiento, puede usarlo porRecyclerViewdentroScrollViewfuente
RecyclerViewreciclaje después de ponerloScrollView. Si desea reciclar, pensando en otro enfoque (como usar RecyclerView con múltiples tipos)Puedes usar de esta manera:
Agregue esta línea a su vista xml de recyclerView:
pruébelo, la vista de reciclaje se desplazará suavemente con una altura flexible
Espero que esto haya ayudado.
fuente
Parece que eso
NestedScrollViewresuelve el problema. He probado usando este diseño:Y funciona sin problemas.
fuente
Usé CustomLayoutManager para deshabilitar el desplazamiento RecyclerView. Tampoco use Recycler View como WrapContent, úselo como 0dp, Weight = 1
Utilice CustomLayoutManager en RecyclerView:
UI XML:
fuente
Estaba teniendo el mismo problema. Eso es lo que probé y funciona. Estoy compartiendo mi código xml y java. Espero que esto ayude a alguien.
Aquí está el xml
Aquí está el código Java relacionado. Funciona a las mil maravillas.
fuente
NestedScrollViewen lugar de vista de desplazamientoEsto hace el truco:
fuente
En realidad, el objetivo principal de la
RecyclerViewes compensarListViewyScrollView. En lugar de hacer lo que realmente está haciendo: tener unRecyclerViewen unScrollView, sugeriría tener solo unoRecyclerViewque pueda manejar muchos tipos de niños.fuente
Primero debes usar en
NestedScrollViewlugar deScrollViewy poner elRecyclerViewinteriorNestedScrollView.Use la clase de diseño personalizado para medir el alto y el ancho de la pantalla:
E implemente el siguiente código en la actividad / fragmento de
RecyclerView:fuente
Si RecyclerView muestra solo una fila dentro de ScrollView. Solo necesita establecer la altura de su fila en
android:layout_height="wrap_content".fuente
también puede anular LinearLayoutManager para hacer que la vista de reciclado funcione sin problemas
fuente
Lamento llegar tarde a la fiesta, pero parece que hay otra solución que funciona perfectamente para el caso que mencionaste.
Si usa una vista de reciclador dentro de una vista de reciclador, parece funcionar perfectamente bien. Personalmente lo he intentado y lo he usado, y parece que no da lentitud ni desigualdad alguna. Ahora no estoy seguro de si es una buena práctica o no, pero anidar varias vistas de reciclador, incluso la vista de desplazamiento anidada se ralentiza. Pero esto parece funcionar bien. Por favor inténtalo. Estoy seguro de que la anidación va a estar perfectamente bien con esto.
fuente
Otro enfoque para abordar el problema es usar
ConstraintLayoutdentroScrollView:Pero aún me apegaría al
androidx.core.widget.NestedScrollViewenfoque, propuesto por Yang Peiyong .fuente
** Solución que funcionó para mí
Use NestedScrollView con height como wrap_content
// El contenido de tu fila va aquí
fuente