Recyclerview dentro de la vista de desplazamiento anidada pero no se desplaza rápidamente como la vista normal de Recycler o la vista de desplazamiento anidada

96

Lo estoy usando por RecyclerViewdentro NestedScrollViewy funciona. Pero cuando lo uso RecyclerViewdentro LinearLayouto algo así, se desplaza a varias velocidades según el gesto. El desplazamiento escucha el gesto y si me deslizo hacia arriba solo un poco, luego se desplaza un poco, mientras que si me deslizo hacia arriba muy rápido, se desplaza muy rápido. Ahora bien, mi problema es que el desplazamiento RecyclerViewinterior NestedScrollViewciertamente, pero el desplazamiento rápido no funciona. Sin embargo, me deslizo hacia arriba rápido o lento, RecyclerViewo NestedScrollViewsolo me desplazo un poco.

¿Cómo puedo hacer que mi NestedScrollViewo el RecyclerViewinterior de esa vista de desplazamiento se desplace a varias velocidades?

Aung Si Min Htet
fuente
3
reciclarView.setNestedScrollingEnabled (falso); ¡¡Esto realmente funciona !!
Aung Si Min Htet
stackoverflow.com/questions/27083091/… La solución se puede encontrar aquí.
maruti060385
Utilice open fun setNestedScrollingEnabled (habilitado: booleano): Unidad Espero que le ayude
Int0TheRainb0w

Respuestas:

266

tratar

recyclerView.setNestedScrollingEnabled(false);
Yang Peiyong
fuente
14
¡Pero con esta configuración, recyclingview no recicla vistas! ¿cuál es tu idea al respecto?
MAYO 3AM
En realidad, estoy agregando dos o más vistas de reciclador con diferentes administradores de diseño (como Diseño lineal y Diseño de cuadrícula) dentro de mi diseño, que también incluyen banner y otras vistas. Entonces, para manejar la vista del reciclador de esa manera, colocando todos estos dentro de la corrección Nested Scroll View para mí.
Aung Si Min Htet
24
No sé cómo esta respuesta obtuvo tantos votos a favor. Si deshabilita el desplazamiento anidado, está frustrando su propósito. ¿Qué pasa si quiero usar pergaminos anidados y reciclador? ¿Algo como CoordinatorLayout, AppBarLayout y RecyclerView?
Jimit Patel
Gracias @JimitPatel, este es exactamente mi problema en este momento. Tengo una vista de reciclaje dentro de una vista de desplazamiento anidado y no puedo desplazarme. stackoverflow.com/questions/41259756/…
Karoly
1
@Karoly necesita personalizar pergaminos anidados ... Tengo eso ... Lo publicaré en unas horas ... Actualmente, estoy viajando. Me enfrenté a ese problema en efecto de paralaje con la vista del reciclador después de la barra de herramientas.
Jimit Patel
53

De forma predeterminada, setNestedScrollingEnabledfunciona solo después de API-21.

Puede usar ViewCompat.setNestedScrollingEnabled(recyclerView, false);para deshabilitar el desplazamiento anidado antes y después de API-21 (Lollipop). Enlace a la documentación .

¡Espero que esto ayude!

Hemant Kaushik
fuente
22

Estaba trabajando en Android 16 donde no era posible usar el método setNestedSCrollEnabled,

Lo que termino haciendo para evitar que RecyclerView maneje Scrolls.

Como en LinerLayoutManager, hice canScrollHorizontally, canScrollVertically para devolver falso por defecto.

myRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false){
            @Override
            public boolean canScrollHorizontally() {
                return false;
            }

            @Override
            public boolean canScrollVertically() {
                return false;
            }
        });
Zain Ali
fuente
Esto realmente funcionó para mí. Tenía un RecyclerView, dentro de LinearLinear, dentro de ScrollView.
FonzTech
9

Después de varias iteraciones, se me ocurrió una solución.

  1. Si está utilizando RecyclerView, entonces:

    recyclerView.setNestedScrollingEnabled(false);
  2. Si está utilizando LinearLayout dentro de NestedScrollingView, tome LinearLayout dentro de un ScrollView normal y luego establezca su desplazamiento en

    scrollView.setNestedScrollingEnabled(false);
Sarthak Gandhi
fuente
2

android: overScrollMode = "nunca

  <android.support.v4.widget.NestedScrollView
    android:id="@+id/nestedScrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:overScrollMode="never">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>
 </android.support.v4.widget.NestedScrollView>
Maryam Azhdari
fuente
1

Puede usar ScrollView con la clase ExtendRecyclerView que anula el método onMeasure. ¡Funciona para mi!

@Override
protected void onMeasure(int widthSpec, int heightSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    super.onMeasure(widthSpec, expandSpec);
}
Quý Nguyễn Nam
fuente
1
recyclerView.setNestedScrollingEnabled(false);

Será útil a veces, pero no es aconsejable para todas las veces, porque desactiva la función de reciclaje de vista en la vista de recylcer.

Alternativas:

Pruebe CollapsiveToolbarLayout con la vista Recycler. poner otras vistas en diseño de barra de peaje plegable.

Rajesh.k
fuente
0

También encontré este problema. Y actualice para 26.1.0solucionarlo.

linkaipeng
fuente
-1

En mi caso, coloqué todas las imágenes en la carpeta dibujable en lugar de la carpeta dibujable-xxxhdpi, por eso la interfaz de usuario de mi pantalla se está retrasando.

Mayuresh Deshmukh
fuente
-3

Debe ajustar la vista del reciclador en cualquier diseño como LinearLayout y establecer el tamaño de RecyclerView en constante, como 800dp. Esto permitirá un desplazamiento suave y la vista del reciclador seguirá siendo la vista del reciclador durante el desplazamiento.

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                                xmlns:app="http://schemas.android.com/apk/res-auto"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:orientation="vertical">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="800dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</LinearLayout>

Thror
fuente
1
Esta es una buena respuesta porque señala el camino para solucionar el problema del desplazamiento sin romper el beneficio principal de RecyclerView, cargando solo las vistas visibles y reciclándolas cuando se desplazan fuera de la vista. Es posible que la gente lo haya rechazado porque un valor fijo como 800dp no funcionará en todos los tamaños y orientaciones de pantalla, pero el valor de layout_height podría calcularse y configurarse programáticamente, un poco complicado, pero resuelve ambos problemas.
jk7
-3

Esto es WAI. NestedScrollView mide sus elementos secundarios con la especificación "Sin especificar". El niño también puede crecer tanto como quiera.

Esto esencialmente iguala la altura de NSV y RV. Entonces, en lo que respecta al RV, cree que se muestra completamente.

Envuelva su RV con una LL y dele altura a su RV. El LL no establecería la especificación de medida como SIN ESPECIFICAR, por lo que el RV se desplazaría correctamente dentro de la altura establecida de los DP que proporcione.

El único inconveniente de este método es que no podrá hacer un emparejamiento parental en su RV.

Muhammad Ahmed AbuTalib
fuente