Pour mon application, j'utilise un RecyclerView
inside a ScrollView
où le RecyclerView
a une hauteur basée sur son contenu en utilisant cette bibliothèque . Le défilement fonctionne mais il ne fonctionne pas correctement lorsque je fais défiler le fichier RecyclerView
. Lorsque je défile sur ScrollView
lui - même, il défile en douceur.
Le code que j'utilise pour définir RecyclerView
:
LinearLayoutManager friendsLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext(), android.support.v7.widget.LinearLayoutManager.VERTICAL, false);
mFriendsListView.setLayoutManager(friendsLayoutManager);
mFriendsListView.addItemDecoration(new DividerItemDecoration(getActivity().getApplicationContext(), null));
Le RecyclerView
dans le 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
la source
la source
androidx.constraintlayout.widget.ConstraintLayout
qui résoudra votre problème sans aucune implémentation complexeRéponses:
Essayez de faire:
Vous pouvez également modifier votre mise en page à l'aide de la bibliothèque de conception de support. Je suppose que votre mise en page actuelle est quelque chose comme:
Vous pouvez modifier cela pour:
Cependant, la route est plus longue et si vous êtes d'accord avec le gestionnaire de mise en page linéaire personnalisé, désactivez simplement le défilement imbriqué dans la vue du recycleur.
Modifier (03/04/2016)
La
v 23.2
version des bibliothèques de support inclut désormais une fonction d'usine de «wrapper le contenu» dans tous lesLayoutManager
s par défaut . Je ne l'ai pas testé, mais vous devriez probablement le préférer à la bibliothèque que vous utilisiez.la source
setNestedScrollingEnabled(false)
n'a fonctionné que lorsque j'ai changé leScrollView
pour un à laNestedScrollView
place.setNestedScrollingEnabled(false)
m'a redonné un défilement fluide avec monRecyclerView
intérieur d'unScrollView
- Merci! Mais je ne comprends toujours pas pourquoi cela fonctionne ...? Que signifie vraiment définir le défilement imbriqué sur false?android:nestedScrollingEnabled="false"
ne fonctionne que pour l'API 21+ maisv.setNestedScrollingEnabled(false)
est OK pour <21.RecyclerView
un problème wrap_content à l'intérieurScrollView
qui ne se produit que sur les appareils marshmallow / nougat (API 23, 24), vérifiez ma solution de contournement sur stackoverflow.com/a/38995399/132121J'avais seulement besoin d'utiliser ceci:
dans ma
onCreateView()
méthode.Merci beaucoup!
la source
Vous pouvez utiliser de cette façon soit:
Ajoutez cette ligne à votre fichier xml recyclerView:
Ou en code java:
J'espère que cela a aidé.
la source
Vous pouvez essayer les deux méthodes avec XML et par programmation. Mais le problème que vous pouvez rencontrer est (en dessous de l'API 21) en le faisant avec XML ne fonctionnera pas. Il est donc préférable de le définir par programme dans votre activité / fragment.
Code XML:
Par programme:
la source
L'utilisation de la vue de défilement imbriquée au lieu de la vue de défilement a résolu mon problème
la source
J'ai eu des problèmes similaires (j'ai essayé de créer un RecyclerViews imbriqué quelque chose comme la conception de Google PlayStore). La meilleure façon de gérer cela est de sous-classer les RecyclerViews enfants et de remplacer les méthodes «onInterceptTouchEvent» et «onTouchEvent». De cette façon, vous obtenez un contrôle complet du comportement de ces événements et éventuellement du défilement.
la source
Le remplacement de ScrollView par NestedScrollView a entraîné un défilement fluide vers le bas.
la source
Si vous utilisez VideoView ou des widgets lourds dans vos vues enfants, gardez votre RecyclerView avec une hauteur à l'
wrap_content
intérieur d'un NestedScrollView avec une hauteur.Lematch_parent
défilement fonctionnera aussi parfaitement que vous le souhaitez.FYI,
Merci Micro, c'était de votre indice!
Karthik
la source
Résumé de toutes les réponses (avantages et inconvénients)
Pour une vue sur le recyclage unique
vous pouvez l'utiliser dans la mise en page Coordinator.
Avantage - il ne chargera pas des éléments entiers de recyclage Chargement si fluide.
Inconvénient - vous ne pouvez pas charger deux vues de recyclage dans la mise en page Coordinator - cela produit des problèmes de défilement
référence - https://stackoverflow.com/a/33143512/3879847
Pour une recylographie multiple avec un minimum de lignes
vous pouvez charger dans NestedScrollView
Avantage - il défilera en douceur
Inconvénient - Il charge toutes les lignes de recyclerview afin que votre activité s'ouvre avec un retard
référence - https://stackoverflow.com/a/33143512/3879847
Pour une recylographie multiple avec de grandes lignes (plus de 100)
Vous devez aller avec recyclerview.
Avantage - Faites défiler en douceur, chargez en douceur
Inconvénient - Vous devez écrire plus de code et de logique
Chargez chaque vue de recyclage dans la vue de recyclage principale à l'aide de multi-vues
ex:
Référence pour multi-viewHolder - https://stackoverflow.com/a/26245463/3879847
la source
Code XML:
en code java:
la source
Ou vous pouvez simplement définir
android:focusableInTouchMode="true"
dans votre vue recycleurla source
Ce code fonctionne pour dans ConstraintLayout android
la source
Kotlin
Défini
isNestedScrollingEnabled
surfalse
pour chaque RecyclerView qui se trouve sous la vue de défilementUtilisation de la mise en page XML
la source