Vue de recyclage à l'intérieur du défilement de la vue par défilement imbriquée, mais ne défile pas rapidement comme la vue de recyclage normale ou la vue de défilement imbriquée


96

J'utilise à l' RecyclerViewintérieur NestedScrollViewet ça marche. Mais lorsque j'utilise à l' RecyclerViewintérieur LinearLayoutou quelque chose du genre, il défile à différentes vitesses en fonction du geste. Le parchemin écoute le geste et si je glisse un peu vers le haut, il défile un peu tandis que si je glisse très vite vers le haut, alors il défile très vite. Maintenant, mon problème est que le défilement RecyclerViewintérieur est NestedScrollViewcertainement mais le défilement rapide ne fonctionne pas. Cependant, je glisse rapidement ou lentement, RecyclerViewou je ne fais NestedScrollViewque défiler un peu.

Comment puis-je faire défiler mon NestedScrollViewou l' RecyclerViewintérieur de cette vue de défilement à différentes vitesses?


3
recyclerView.setNestedScrollingEnabled (false); Cela fonctionne vraiment !!
Aung Si Min Htet


Réponses:


266

essayer

recyclerView.setNestedScrollingEnabled(false);

14
Mais avec ce paramètre, recyclerview ne recycle pas les vues! quelle est votre idée à ce sujet?
MAY3AM

En fait, j'ajoute deux ou plusieurs vues de recycleur avec différents gestionnaires de mise en page (tels que la mise en page linéaire et la mise en page de grille) à l'intérieur de ma mise en page, qui incluent également une bannière et d'autres vues. Donc, pour gérer la vue du recycleur comme ça, mettez tout cela dans le correctif de la vue de défilement imbriquée pour moi.
Aung Si Min Htet

24
Je ne sais pas comment cette réponse a obtenu autant de votes positifs. Si vous désactivez le défilement imbriqué, cela va à l'encontre de son objectif. Et si je veux utiliser des parchemins imbriqués et un recycleur? Quelque chose comme CoordinatorLayout, AppBarLayout et RecyclerView ??
Jimit Patel

Merci @JimitPatel, c'est exactement mon problème pour le moment. J'ai une vue de recyclage dans une vue de défilement imbriquée et je ne peux pas faire défiler. stackoverflow.com/questions/41259756/…
Karoly

1
@Karoly a besoin de personnaliser les parchemins imbriqués ... J'ai ça ... Je posterai ça dans quelques heures ... Actuellement, je voyage. J'ai rencontré ce problème dans l'effet de parallaxe avec la vue du recycleur après la barre d'outils.
Jimit Patel

53

Par défaut, setNestedScrollingEnabledfonctionne uniquement après l'API-21.

Vous pouvez utiliser ViewCompat.setNestedScrollingEnabled(recyclerView, false);pour désactiver le défilement imbriqué avant et après l'API-21 (Lollipop). Lien vers la documentation .

J'espère que cette aide!


22

Je travaillais sur Android 16 où il n'était pas possible d'utiliser la méthode setNestedSCrollEnabled,

Ce que je finis par faire pour empêcher RecyclerView de gérer les parchemins.

Comme dans LinerLayoutManager, j'ai créé canScrollHorizontally, canScrollVertically pour retourner false par défaut.

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

            @Override
            public boolean canScrollVertically() {
                return false;
            }
        });

Cela a fonctionné pour moi. J'avais un RecyclerView, à l'intérieur d'un LinearLinear, à l'intérieur d'un ScrollView.
FonzTech

9

Après plusieurs itérations, j'ai trouvé une solution.

  1. Si vous utilisez RecyclerView, alors:

    recyclerView.setNestedScrollingEnabled(false);
  2. Si vous utilisez LinearLayout dans NestedScrollingView, prenez le LinearLayout dans un ScrollView normal, puis définissez son défilement sur

    scrollView.setNestedScrollingEnabled(false);

2

android: overScrollMode = "jamais

  <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>

1

Vous pouvez utiliser ScrollView avec la classe ExtendRecyclerView qui remplace la méthode onMeasure. Ça marche pour moi!

@Override
protected void onMeasure(int widthSpec, int heightSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    super.onMeasure(widthSpec, expandSpec);
}

1
recyclerView.setNestedScrollingEnabled(false);

Cela sera parfois utile, mais ce n'est pas toujours conseillé, car il désactive la fonction de recyclage de la vue dans la vue du recycleur.

Alternatives:

Essayez CollapsiveToolbarLayout avec la vue Recycler. mettre d'autres vues dans la disposition collapsiveTollbar.


0

J'ai également rencontré ce problème. Et mettez à niveau pour le 26.1.0réparer.


-1

Dans mon cas, j'ai placé toutes les images dans un dossier drawable insted du dossier drawable-xxxhdpi c'est pourquoi mon interface utilisateur d'écran est à la traîne.


-3

Vous devez encapsuler la vue du recycleur dans n'importe quelle mise en page telle que LinearLayout et définir la taille de RecyclerView sur constante, comme 800dp. Cela permettra un défilement fluide et la vue du recycleur restera les vues du recycleur pendant le défilement.

<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>


1
C'est une bonne réponse car elle indique la manière de résoudre le problème du fling scroll sans casser le principal avantage de RecyclerView, en ne chargeant que les vues visibles et en les recyclant lorsqu'elles sont défilées hors de vue. Les gens peuvent avoir voté à la baisse parce qu'une valeur fixe comme 800dp ne fonctionnera pas dans toutes les tailles et orientations d'écran, mais la valeur layout_height pourrait être calculée et définie par programme - un peu compliquée, mais elle résout les deux problèmes.
jk7

-3

C'est WAI. Le NestedScrollView mesure ses enfants avec la spécification «Unspecified». L'enfant peut aussi grandir autant qu'il le souhaite.

Cela équivaut essentiellement à la hauteur de NSV et RV. Donc, en ce qui concerne le VR, il estime qu'il est complètement affiché.

Enveloppez votre VR avec un LL et donnez à votre RV une hauteur. Le LL ne définirait pas la spécification de mesure comme NON SPÉCIFIÉE afin que le RV défile correctement dans sa hauteur définie, quel que soit le DP que vous fournissez.

Le seul inconvénient de cette méthode est que vous ne pourrez pas faire de correspondance parent sur votre VR.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.