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
(ahoraScrollView
contieneRecyclerView
): puede ver la tarjeta hastaRecyclerView
- El pensamiento inicial era implementar esto
viewGroup
usando enRecyclerView
lugar deScrollView
donde una de sus vistas es el tipoCardView
pero obtuve exactamente los mismos resultados que con elScrollView
NestedScrollView
en su lugar, ya que maneja muchos problemas de desplazamientoNestedScrollView
lugar de aScrollView
. Para eso es exactamente.Respuestas:
usar en
NestedScrollView
lugar deScrollView
Consulte el documento de referencia NestedScrollView para obtener más información.
y añadir
recyclerView.setNestedScrollingEnabled(false);
a tuRecyclerView
fuente
android:layout_height="wrap_content"
para el diseño inflado para ViewHolderNestedScrollView
retrasa para mí, a diferencia delScrollView
. Buscando una solución sin usarNestedScrollView
Sé 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.RecyclerView
La cuestión ahora es consigo
RecyclerView
conlayout_height=wrap_content
no tomar la altura de todos los elementos en el interior temaScrollView
que solamente ocurre en las versiones de malvavisco y Turrón + (API 23, 24, 25).(ACTUALIZACIÓN: Reemplazar
ScrollView
conandroid.support.v4.widget.NestedScrollView
trabajos 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
RecyclerView
conRelativeLayout
. ¡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
adapterItemSize
variable?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
RecyclerView
y 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_content
la 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=true
y 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
RecyclerView
la 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 suonMeasure
mé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
RecyclerView
dentroNestedScrollView
y habilitarecyclerView.setNestedScrollingEnabled(false);
, el desplazamiento funcionará bien .Sin embargo, hay un problema.
Por ejemplo, su
RecyclerView
(dentroNestedScrollView
oScrollView
) tiene 100 elementos.Cuando se
Activity
inicie, se crearán 100 elementos (onCreateViewHolder
y seonBindViewHolder
invocará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
RecyclerView
con múltiples tipos.Sin embargo, si en su caso, solo hay unos pocos elementos
RecyclerView
y recicla o no recicla no afecta mucho el rendimiento, puede usarlo porRecyclerView
dentroScrollView
fuente
RecyclerView
reciclaje 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
NestedScrollView
resuelve 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
NestedScrollView
en lugar de vista de desplazamientoEsto hace el truco:
fuente
En realidad, el objetivo principal de la
RecyclerView
es compensarListView
yScrollView
. En lugar de hacer lo que realmente está haciendo: tener unRecyclerView
en unScrollView
, sugeriría tener solo unoRecyclerView
que pueda manejar muchos tipos de niños.fuente
Primero debes usar en
NestedScrollView
lugar deScrollView
y poner elRecyclerView
interiorNestedScrollView
.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
ConstraintLayout
dentroScrollView
:Pero aún me apegaría al
androidx.core.widget.NestedScrollView
enfoque, 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