Para mi aplicación, estoy usando un RecyclerView
dentro de ScrollView
donde RecyclerView
tiene una altura basada en su contenido usando esta biblioteca . El desplazamiento funciona pero no funciona correctamente cuando me desplazo sobre el RecyclerView
. Cuando me desplazo sobre el ScrollView
mismo, se desplaza suavemente.
El código que estoy usando para definir el RecyclerView
:
LinearLayoutManager friendsLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext(), android.support.v7.widget.LinearLayoutManager.VERTICAL, false);
mFriendsListView.setLayoutManager(friendsLayoutManager);
mFriendsListView.addItemDecoration(new DividerItemDecoration(getActivity().getApplicationContext(), null));
El RecyclerView
en el ScrollView
:
<android.support.v7.widget.RecyclerView
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:id="@+id/friendsList"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
android
android-recyclerview
android-scrollview
android-scroll
Bart Bergmans
fuente
fuente
androidx.constraintlayout.widget.ConstraintLayout
que resolverá su problema sin implementaciones complejasRespuestas:
Trata de hacerlo:
Como alternativa, puede modificar su diseño utilizando la biblioteca de diseño de soporte. Supongo que su diseño actual es algo así como:
Puede modificar eso para:
Sin embargo, este es un camino más largo que tomar, y si está de acuerdo con el administrador de diseño lineal personalizado, simplemente deshabilite el desplazamiento anidado en la vista del reciclador.
Editar (4/3/2016)
El
v 23.2
lanzamiento de las bibliotecas de soporte ahora incluye una característica de fábrica de "contenido envolvente" en todos losLayoutManager
s predeterminados . No lo probé, pero probablemente deberías preferirlo a esa biblioteca que estabas usando.fuente
setNestedScrollingEnabled(false)
solo funcionó cuando cambié elScrollView
por unNestedScrollView
lugar.setNestedScrollingEnabled(false)
me devolvió el desplazamiento suave con elRecyclerView
interior de unScrollView
- ¡Gracias! Pero todavía no entiendo por qué eso funciona ... ¿Qué significa realmente establecer un desplazamiento anidado falso?android:nestedScrollingEnabled="false"
solo funciona para API 21+ perov.setNestedScrollingEnabled(false)
está bien para <21.RecyclerView
un problema de wrap_content dentro deScrollView
eso que solo ocurre en dispositivos de malvavisco / turrón (API 23, 24), revise mi solución en stackoverflow.com/a/38995399/132121Solo necesitaba usar esto:
en mi
onCreateView()
metodo¡Muchas gracias!
fuente
Puede usar de esta manera:
Agregue esta línea a su archivo xml de recyclerView:
O en código java:
Espero que esto haya ayudado.
fuente
Puede probar tanto con XML como mediante programación. Pero el problema que puede enfrentar es (debajo de API 21) al hacerlo con XML no funcionará. Por lo tanto, es mejor configurarlo mediante programación en su Actividad / Fragmento.
Código XML:
Programáticamente:
fuente
El uso de la Vista de desplazamiento anidada en lugar de la Vista de desplazamiento resolvió mi problema
fuente
Tuve problemas similares (intenté crear un RecyclerViews anidado similar al diseño de Google PlayStore). La mejor manera de lidiar con esto es subclasificar las RecyclerViews secundarias y anular los métodos 'onInterceptTouchEvent' y 'onTouchEvent'. De esta manera, obtienes el control completo de cómo se comportan esos eventos y, finalmente, el desplazamiento.
fuente
Reemplazar ScrollView con NestedScrollView resultó en un desplazamiento suave hacia abajo.
fuente
Si está utilizando VideoView o widgets pesados en sus vistas de niño, mantenga su RecyclerView con altura
wrap_content
dentro de un NestedScrollView con altura.match_parent
Luego, el desplazamiento funcionará sin problemas tan perfectamente como lo desee.FYI
¡Gracias Micro, esto fue de tu indirecta!
karthik
fuente
Resumen de todas las respuestas (ventajas y desventajas)
Para una sola vista de reciclado
puedes usarlo dentro del diseño del Coordinador.
Ventaja : no cargará elementos completos de la vista del reciclador. Tan suave carga.
Desventaja : no puede cargar dos vistas de reciclador dentro del diseño del Coordinador: produce problemas de desplazamiento
referencia - https://stackoverflow.com/a/33143512/3879847
Para múltiples vistas de reciclador con filas mínimas
puedes cargar dentro de NestedScrollView
Ventaja : se desplazará suavemente
Desventaja : carga todas las filas de la vista del reciclador para que su actividad se abra con retraso
referencia - https://stackoverflow.com/a/33143512/3879847
Para múltiples vistas de reciclador con grandes filas (más de 100)
Debes ir con la vista de reciclaje.
Ventaja : desplácese suavemente, cargue suavemente
Desventaja : necesita escribir más código y lógica
Cargue cada vista de reciclador dentro de la vista de reciclador principal con la ayuda de múltiples usuarios
ex:
Referencia para multi-viewHolder - https://stackoverflow.com/a/26245463/3879847
fuente
Código XML:
en código java:
fuente
O simplemente puede configurar
android:focusableInTouchMode="true"
en su vista de recicladorfuente
Este código está funcionando en Android ConstraintLayout
fuente
Kotlin
Establecer
isNestedScrollingEnabled
afalse
por cada RecyclerView que está bajo el punto de vista de desplazamientoUsar diseño XML
fuente