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?

Aung Si Min Htet
la source
3
recyclerView.setNestedScrollingEnabled (false); Cela fonctionne vraiment !!
Aung Si Min Htet
stackoverflow.com/questions/27083091/… La solution peut être trouvée ici.
maruti060385
Veuillez utiliser open fun setNestedScrollingEnabled (enabled: Boolean): Unit Hope it will help you
Int0TheRainb0w

Réponses:

266

essayer

recyclerView.setNestedScrollingEnabled(false);
Yang Peiyong
la source
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!

Hemant Kaushik
la source
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;
            }
        });
Zain Ali
la source
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);
Sarthak Gandhi
la source
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>
Maryam Azhdari
la source
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);
}
Quý Nguyễn Nam
la source
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.

Rajesh.k
la source
0

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

linkaipeng
la source
-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.

Mayuresh Deshmukh
la source
-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>

Thror
la source
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.

Muhammad Ahmed AbuTalib
la source