studio recyclerview inside horizontal fillviewport android android-recyclerview android-scrollview android-scroll

android - inside - Recyclerview dentro de ScrollView no se desplaza suavemente



scrollview android fillviewport (11)

Código XML:

<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" android:clipToPadding="false" /> </android.support.v4.widget.NestedScrollView>

en código java:

recycleView = (RecyclerView) findViewById(R.id.recycleView); recycleView.setNestedScrollingEnabled(false);

Para mi aplicación, estoy usando un RecyclerView dentro de un ScrollView donde RecyclerView tiene una altura basada en su contenido usando esta biblioteca . El desplazamiento funciona pero no funciona correctamente cuando me desplazo sobre RecyclerView . Cuando me desplazo sobre el ScrollView , 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" />


El uso de la Vista de desplazamiento anidada en lugar de la Vista de desplazamiento resolvió mi problema

<LinearLayout> <!--Main Layout --> <android.support.v4.widget.NestedScrollView> <LinearLayout > <!--Nested Scoll View enclosing Layout -->` <View > <!-- upper content --> <RecyclerView > </LinearLayout > </android.support.v4.widget.NestedScrollView> </LinearLayout>


O simplemente puede configurar android:focusableInTouchMode="true" en su vista de reciclador


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:

<android.support.v7.widget.RecyclerView android:id="@+id/recycleView" android:layout_width="match_parent" android:visibility="gone" android:nestedScrollingEnabled="false" android:layout_height="wrap_content" android:layout_below="@+id/linearLayoutBottomText" />

Programáticamente:

recycleView = (RecyclerView) findViewById(R.id.recycleView); recycleView.setNestedScrollingEnabled(false);


Puede usar de esta manera:

Agregue esta línea a su archivo xml de recyclerView:

android:nestedScrollingEnabled="false"

O en código java:

RecyclerView.setNestedScrollingEnabled(false);

Espero que esto haya ayudado.


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://.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://.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:

MainRecyclerview

-ChildRecyclerview1 (ViewHolder1) -ChildRecyclerview2 (ViewHolder2) -ChildRecyclerview3 (ViewHolder3) -Any other layout (ViewHolder4)

Referencia para multi-viewHolder - https://.com/a/26245463/3879847


Si está utilizando VideoView o widgets pesados ​​en sus vistas secundarias, mantenga su RecyclerView con alto wrap_content dentro de un NestedScrollView con height match_parent Luego, el desplazamiento funcionará sin problemas tan perfectamente como lo desee.

FYI

<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:nestedScrollingEnabled="false" android:layout_height="wrap_content" android:clipToPadding="false" /> </android.support.v4.widget.NestedScrollView>

¡Gracias Micro, esto fue de tu indirecta!

karthik


Solo necesitaba usar esto:

mMyRecyclerView.setNestedScrollingEnabled(false);

en mi método onCreateView() .

¡Muchas gracias!


Trata de hacerlo:

RecyclerView v = (RecyclerView) findViewById(...); v.setNestedScrollingEnabled(false);

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:

<ScrollView > <LinearLayout > <View > <!-- upper content --> <RecyclerView > <!-- with custom layoutmanager --> </LinearLayout > </ScrollView >

Puede modificar eso para:

<CoordinatorLayout > <AppBarLayout > <CollapsingToolbarLayout > <!-- with your content, and layout_scrollFlags="scroll" --> </CollapsingToolbarLayout > </AppBarLayout > <RecyclerView > <!-- with standard layoutManager --> </CoordinatorLayout >

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)

La versión v 23.2 de las bibliotecas de soporte ahora incluye una característica de fábrica de "envolver contenido" en todos los LayoutManager predeterminados. No lo probé, pero probablemente deberías preferirlo a esa biblioteca que estabas usando.

<ScrollView > <LinearLayout > <View > <!-- upper content --> <RecyclerView > <!-- with wrap_content --> </LinearLayout > </ScrollView >


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.


<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"> <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"> <android.support.constraint.ConstraintLayout android:id="@+id/constraintlayout_main" android:layout_width="match_parent" android:layout_height="@dimen/layout_width_height_fortyfive" android:layout_marginLeft="@dimen/padding_margin_sixteen" android:layout_marginRight="@dimen/padding_margin_sixteen" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"> <TextView android:id="@+id/textview_settings" style="@style/textviewHeaderMain" android:gravity="start" android:text="@string/app_name" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> </android.support.constraint.ConstraintLayout> <android.support.constraint.ConstraintLayout android:id="@+id/constraintlayout_recyclerview" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/padding_margin_zero" android:layout_marginTop="@dimen/padding_margin_zero" android:layout_marginEnd="@dimen/padding_margin_zero" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/constraintlayout_main"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:nestedScrollingEnabled="false" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> </android.support.constraint.ConstraintLayout> </android.support.constraint.ConstraintLayout> </android.support.v4.widget.NestedScrollView> </android.support.constraint.ConstraintLayout>

Este código funciona en Android ConstraintLayout