Comment utiliser à l' RecyclerView
intérieur NestedScrollView
?
RecyclerView
le contenu n'est pas visible après avoir configuré l'adaptateur.
MISE À JOUR du code de mise en page.
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/keyline_1">
</RelativeLayout>
<View
android:id="@+id/separator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#e5e5e5" />
<android.support.v7.widget.RecyclerView
android:id="@+id/conversation"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
Réponses:
Remplacez votre recyclerView par,
ici,
va gérer le reste des choses.
Encore une chose, pas besoin de mettre votre recycleurView dans NestedScrollView
la source
NestedScrollView
mais juste avecapp:layout_behavior="@string/appbar_scrolling_view_behavior"
. Telle est la clé!CoordinatorLayout
,AppBarLayout
et le réglage appropriélayout_scrollFlags
sur la ou les vues enfant à faire défiler avecRecyclerView
. Je ne sais pas pourquoi cela a été omis de la réponse. Sinon, c'est une solution agréable et simple.MISE À JOUR 1
Depuis la bibliothèque de support Android 23.2.0, une méthode a été ajoutée
setAutoMeasureEnabled(true)
pour les LayoutManagers. Il fait recyclerView pour envelopper son contenu et fonctionne comme un charme.http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
Alors ajoutez simplement quelque chose comme ceci:
MISE À JOUR 2
Étant donné que 27.1.0
setAutoMeasureEnabled
est obsolète, vous devez donc fournir une implémentation personnalisée de LayoutManager avec la méthode substituéeisAutoMeasureEnabled()
Mais après de nombreux cas d'utilisation de RecyclerView, je recommande fortement de ne pas l'utiliser dans mode d'emballage , car ce n'est pas ce à quoi il est destiné. Essayez de refaçonner l'ensemble de votre mise en page en utilisant un seul RecyclerView normal avec plusieurs types d'éléments. Ou utilisez l'approche avec LinearLayout que j'ai décrite ci-dessous en dernier recours
Ancienne réponse (non recommandée)
Vous pouvez utiliser à l'
RecyclerView
intérieurNestedScrollView
. Tout d'abord, vous devez implémenter votre propre personnalisationLinearLayoutManager
, cela vous permetRecyclerView
d'envelopper son contenu. Par exemple:Après cela, utilisez ceci
LayoutManager
pour votreRecyclerView
Mais vous devez également appeler ces deux méthodes:
Ici,
setNestedScrollingEnabled(false)
désactivez le défilement pourRecyclerView
, afin qu'il n'intercepte pas l'événement de défilement deNestedScrollView
. EtsetHasFixedSize(false)
déterminez que les modifications du contenu de l'adaptateur peuvent modifier la taille duRecyclerView
Remarque importante: cette solution est peu buggée dans certains cas et a des problèmes de performances, donc si vous avez beaucoup d'éléments dans votre,
RecyclerView
je vous recommande d'utiliser uneLinearLayout
implémentation personnalisée de l'affichage de liste, de créer l'analogue de l'adaptateur pour cela et de le faire se comporter commeListView
ouRecyclerView
la source
RecyclerView
.1) Vous devez utiliser la bibliothèque de support 23.2.0 (ou) ci-dessus
2) et la
RecyclerView
hauteur serawrap_content
.3)
recyclerView.setNestedScrollingEnabled(false)
Mais en faisant cela, le modèle de recycleur ne fonctionne pas . (c.-à-d. que toutes les vues seront chargées en une seule fois, car elles ont
wrap_content
besoin de la hauteur complèteRecyclerView
pour qu'elles dessinent tous les enfantsViews at once. No view will be recycled). Try not to use this pattern unless it is really required. Try to use
viewTypeand add all other views that need to scroll to
RecyclerViewrather than using
RecyclerViewin
Scrollview`. L'impact sur les performances sera très élevé.Pour faire simple "il agit comme
LinearLayout
avec toutes les vues enfant"la source
recyclerView.setNestedScrollingEnabled(false)
m'a aidé à avoir un défilement fluide.Vous pouvez utiliser
android:fillViewport="true"
pourNestedScrollView
mesurer leRecyclerView
. LeRecyclerView
remplira la hauteur restante. donc si vous voulez faire défiler laNestScrollView
, vous pouvez définir lesRecyclerView
« sminHeight
.la source
Ajouter simplement
recyclerView.setNestedScrollingEnabled(false);
avantsetAdapter
lui-même a fonctionné pour moi. Je n'ai ajoutéapp:layout_behavior="@string/appbar_scrolling_view_behavior"
aucun endroit et je n'ai défini aucun gestionnaire de mise en page personnaliséla source
C'est ce qui fonctionne pour moi
la source
Il existe un code simple et de test que vous pouvez vérifier
la source
Car
androidx
il s'appelleandroidx.core.widget.NestedScrollView
- et il défile également comme du beurre avec des propriétésisScrollContainer
etmeasureAllChildren
activé:la source
Essayez d'utiliser cette bibliothèque - https://github.com/serso/android-linear-layout-manager .
LayoutManager de la bibliothèque fait recyclerView enveloppe son contenu. Dans ce cas, RecyclerView sera "aussi grand que les vues intérieures", il n'aura donc pas de barres de défilement et l'utilisateur utilisera les capacités de défilement de NestedScrollView. Par conséquent, il ne sera pas ambigu comme "scrollable inside scrollable".
la source
Voici le code que j'utilise pour éviter les problèmes de défilement:
la source
J'ai utilisé RecyclerView dans un NestedScrollView et cela a fonctionné pour moi. Le seul problème que je devais garder à l'esprit était qu'un NestedScrollView ne prend qu'une seule vue enfant. Donc, dans mon cas, j'ai utilisé le groupe de vues LienearLayout qui hébergeait mon RecyclerView et un certain nombre d'autres vues dont j'avais besoin.
Je rencontre un problème en plaçant mon RecyclerView dans le NestedScrollView. J'ai réalisé que le défilement du contenu de mon RecyclerView était ralenti.
J'ai réalisé plus tard que mon RecyclerView recevait l'événement de défilement et était donc en conflit avec le comportement de défilement du NestedScrollView.
Donc, pour résoudre ce problème, j'ai dû désactiver la fonctionnalité de défilement de mon RecyclerView avec cette méthode
movieListNewRecyclerView.setNestedScrollingEnabled(false);
Vous pouvez consulter mon Instagram pour une courte vidéo de ce que j'ai réellement fait. C'est ma poignée instagram ofelix03
Cliquez sur cette image pour voir ce que j'ai fait
la source
J'ai Viewpager et RecyclerView dans le NestedScrollView. Après avoir ajouté les lignes ci-dessous
J'ai résolu le problème de défilement lent et de retard de défilement.
la source
recyclerView.setHasFixedSize(true);
?Vous ne pouvez pas utiliser une vue de recycleur dans une vue de défilement imbriquée. Il n'est pas destiné à contenir d'autres vues défilables, mais c'est parce que c'est un enfant d'une disposition de défilement lui-même que vous avez besoin de la vue de défilement imbriquée. J'ai eu le même problème mais à la fin, j'ai déplacé ma vue de texte pour être une vue de tête dans la vue de recyclage, j'ai fait de la vue de recyclage un enfant direct de la disposition du coordinateur et j'ai supprimé la vue de défilement imbriquée. Ensuite, tous mes problèmes ont disparu.
la source
RecyclerView
implémenteNestedScrollingChild
,RecyclerView
devrait pouvoir être défilé viaNestedScrollView
.Si vous utilisez
RecyclerView-23.2.1
ou plus tard. La solution suivante fonctionnera très bien:Dans votre mise en page, ajoutez RecyclerView comme ceci:
Et dans votre fichier java:
Ici
layoutManager.setAutoMeasureEnabled(true);
fera l'affaire.Consultez ce problème et ce blog de développeur pour plus d'informations.
la source
Une solution pour conserver la fonction de recyclage de la vue de recyclage et éviter que la vue de recyclage charge toutes vos données consiste à définir une hauteur fixe dans la vue de recyclage elle-même. En faisant cela, la vue d'ensemble du recyclage est limitée uniquement à charger autant que sa hauteur peut montrer à l'utilisateur recyclant ainsi son élément si jamais vous faites défiler vers le bas / haut.
la source
Il y a beaucoup de bonnes réponses. La clé est que vous devez définir
nestedScrollingEnabled
àfalse
. Comme mentionné ci-dessus, vous pouvez le faire en code java:Mais vous avez également la possibilité de définir la même propriété dans le code xml (
android:nestedScrollingEnabled="false"
):la source
Si vous utilisez RecyclerView ScrollListener dans NestedScrollView , l'écouteur addOnScrollListener ne fonctionne pas correctement si vous êtes utilisé les deux.
Utilisez ce code.
ce code fonctionne correctement RecyclerView ScrollListener dans NestedScrollView .
Merci
la source
J'ai dû implémenter CoordinatorLayout avec le défilement de la barre d'outils et cela m'a juste pris toute la journée à déconner. Je l'ai fait fonctionner en supprimant NestedScrollView du tout. Je n'utilise donc que RelativeLayout à la racine.
la source
n'utilisez pas recyclerView dans NestedScrollView. cela peut provoquer des problèmes de cascade! Je suggère d'utiliser ItemViewTypes dans RecyclerView pour gérer plusieurs types de vues. ajoutez simplement un RecyclerView avec la largeur et la hauteur de match_parent. puis dans votre recyclerViewAdapter, remplacez getItemViewType et utilisez position pour gérer la disposition à gonfler. après cela, vous pouvez gérer votre détenteur de vue en utilisant la méthode onBindViewHolder.
la source
la source
J'ai utilisé cette extension géniale (écrite en kotlin mais peut également être utilisée en Java)
https://github.com/Widgetlabs/expedition-nestedscrollview
Fondamentalement, vous obtenez l'
NestedRecyclerView
intérieur de n'importe quel paquet, disons des utils dans votre projet, puis créez simplement votre vue de recyclage commeConsultez cet article génial de Marc Knaup
https://medium.com/widgetlabs-engineering/scrollable-nestedscrollviews-inside-recyclerview-ca65050d828a
la source
Bénéfices:
Réparer :
la source
Dans mon cas, l'enfant de NestedScrollview est ConstraintLayout. Cela ne fonctionne pas comme prévu, je l'ai remplacé par LinearLayout. Peut-être que cela aide quelqu'un.
la source
RecyclerView avec NestedScrollView
la source