J'essaie d'implémenter une disposition qui contient RecyclerView et ScrollView dans la même disposition.
Modèle de mise en page:
<RelativeLayout>
<ScrollView android:id="@+id/myScrollView">
<unrelated data>...</unrealated data>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/my_recycler_view"
/>
</ScrollView>
</RelativeLayout>
Problèmes: je peux faire défiler jusqu'au dernier élément de ScrollView
Choses que j'ai essayées:
- vue de la carte à l'intérieur du
ScrollView
(ScrollView
contient maintenantRecyclerView
) - peut voir la carte jusqu'àRecyclerView
- la pensée initiale était de mettre en œuvre cela en
viewGroup
utilisantRecyclerView
au lieu de l'ScrollView
un de ses types de vues est leCardView
mais j'ai obtenu exactement les mêmes résultats qu'avec leScrollView
NestedScrollView
place, car elle gère de nombreux problèmes de défilementNestedScrollView
au lieu d'unScrollView
. C'est exactement pour ça.Réponses:
utiliser
NestedScrollView
au lieu deScrollView
Veuillez consulter le document de référence NestedScrollView pour plus d'informations.
et ajouter
recyclerView.setNestedScrollingEnabled(false);
à votreRecyclerView
la source
android:layout_height="wrap_content"
pour la mise en page gonflée pour ViewHolderNestedScrollView
en page complexe traîne pour moi, contrairement auScrollView
. Recherche d'une solution sans utiliserNestedScrollView
Je sais que je suis en retard dans le jeu, mais le problème persiste même après que Google a corrigé le problème.
android.support.v7.widget.RecyclerView
Le problème que j'obtiens maintenant est
RecyclerView
delayout_height=wrap_content
ne pas prendre la hauteur de tous les problèmes d'objets à l'intérieurScrollView
qui ne se produisent que sur les versions Marshmallow et Nougat + (API 23, 24, 25).(MISE À JOUR: Remplacement
ScrollView
par desandroid.support.v4.widget.NestedScrollView
travaux sur toutes les versions. J'ai en quelque sorte manqué de tester la solution acceptée . Ajoutée dans mon projet github comme démo.)Après avoir essayé différentes choses, j'ai trouvé une solution de contournement qui résout ce problème.
Voici ma structure de mise en page en bref:
La solution consiste à envelopper le
RecyclerView
avecRelativeLayout
. Ne me demandez pas comment j'ai trouvé cette solution de contournement !!!¯\_(ツ)_/¯
Un exemple complet est disponible sur le projet GitHub - https://github.com/amardeshbd/android-recycler-view-wrap-content
Voici une capture d'écran de démonstration montrant le correctif en action:
la source
Bien que la recommandation
Est un bon conseil, mais si vous définissez une hauteur fixe sur la vue du recycleur, cela devrait fonctionner correctement.
Si vous connaissez la hauteur de la disposition de l'élément adaptateur, vous pouvez simplement calculer la hauteur de RecyclerView.
la source
adapterItemSize
variable?Dans le cas où la définition d'une hauteur fixe pour le RecyclerView ne fonctionnait pas pour quelqu'un (comme moi), voici ce que j'ai ajouté à la solution à hauteur fixe:
la source
La nouvelle bibliothèque de support Android 23.2 résout ce problème, vous pouvez maintenant définir wrap_content comme hauteur de votre
RecyclerView
et fonctionne correctement.Bibliothèque de support Android 23.2
la source
RecyclerViews est bien pour mettre dans ScrollViews tant qu'ils ne défilent pas eux-mêmes. Dans ce cas, il est logique d'en faire une hauteur fixe.
La bonne solution consiste à utiliser
wrap_content
sur la hauteur de RecyclerView, puis à implémenter un LinearLayoutManager personnalisé qui peut gérer correctement l'emballage.Copiez ce LinearLayoutManager dans votre projet: https://github.com/serso/android-linear-layout-manager/blob/master/lib/src/main/java/org/solovyev/android/views/llm/LinearLayoutManager.java
Enveloppez ensuite le RecyclerView:
Et configurez-le comme suit:
Modifier: cela peut entraîner des complications avec le défilement, car le RecyclerView peut voler les événements tactiles du ScrollView. Ma solution consistait simplement à abandonner le RecyclerView dans son ensemble et à utiliser un LinearLayout, à gonfler par programme des sous-vues et à les ajouter à la mise en page.
la source
Pour
ScrollView
, vous pouvez utiliserfillViewport=true
et créerlayout_height="match_parent"
comme ci-dessous et mettre la vue du recycleur à l'intérieur:Aucun autre réglage de la hauteur n'est nécessaire grâce au code.
la source
Calculer
RecyclerView
la hauteur manuellement n'est pas bon, il vaut mieux utiliser une personnalisationLayoutManager
.La raison en question ci - dessus est une vue qui a défilement de ce (
ListView
,GridView
,RecyclerView
) n'a pas réussi à calculer sa hauteur quand ajouter comme un enfant dans un autre point de vue a défilement. Donc, remplacer saonMeasure
méthode résoudra le problème.Veuillez remplacer le gestionnaire de mise en page par défaut par le suivant:
la source
Essaye ça. Réponse très tardive. Mais sûrement aider quelqu'un à l'avenir.
Définissez votre Scrollview sur NestedScrollView
Dans votre Recyclerview
la source
MISE À JOUR: cette réponse est obsolète maintenant car il existe des widgets comme NestedScrollView et RecyclerView qui prennent en charge le défilement imbriqué.
vous ne devriez jamais mettre une vue défilante dans une autre vue défilante!
Je vous suggère de créer votre vue de recycleur de mise en page principale et de placer vos vues en tant qu'éléments de vue de recycleur.
jetez un oeil à cet exemple, il montre comment utiliser plusieurs vues à l'intérieur de l'adaptateur de vue recycleur. lien vers l'exemple
la source
Si vous mettez à l'
RecyclerView
intérieurNestedScrollView
et activezrecyclerView.setNestedScrollingEnabled(false);
, le défilement fonctionnera bien .Cependant, il y a un problème
Par exemple, vos
RecyclerView
(à l'intérieurNestedScrollView
ouScrollView
) ont 100 articles.Lors du
Activity
lancement, 100 éléments seront créés (onCreateViewHolder
etonBindViewHolder
100 éléments seront appelés en même temps).Par exemple, pour chaque élément, vous allez charger une grande image à partir de l'API => activité créée -> 100 images seront chargées.
Cela ralentit et ralentit le démarrage de l'activité.
Solution possible :
- Penser à utiliser
RecyclerView
avec plusieurs types.Cependant, si dans votre cas, il n'y a que quelques éléments
RecyclerView
et le recyclage ou le recyclage n'affectent pas beaucoup les performances, vous pouvez l'utiliser à l'RecyclerView
intérieurScrollView
pour de simplesla source
RecyclerView
recycler après l'avoir misScrollView
. Si vous voulez recycler, penser à une autre approche (comme utiliser RecyclerView avec plusieurs types)Vous pouvez utiliser cette méthode soit:
Ajoutez cette ligne à votre vue xml recyclerView:
essayez-le, recyclerview défilera en douceur avec une hauteur flexible
j'espère que cela a aidé.
la source
Il semble que
NestedScrollView
cela résout le problème. J'ai testé en utilisant cette disposition:Et cela fonctionne sans problèmes
la source
J'ai utilisé CustomLayoutManager pour désactiver le défilement de RecyclerView. N'utilisez pas non plus Recycler View comme WrapContent, utilisez-le comme 0dp, Weight = 1
Utilisez CustomLayoutManager dans RecyclerView:
UI XML:
la source
J'avais le même problème. C'est ce que j'ai essayé et ça marche. Je partage mon code xml et java. J'espère que cela aidera quelqu'un.
Voici le xml
Voici le code java associé. Il fonctionne comme un charme.
la source
NestedScrollView
au lieu de la vue de défilementCela fait l'affaire:
la source
En fait, le but principal de la
RecyclerView
est de compenserListView
etScrollView
. Au lieu de faire ce que vous faites réellement: avoir unRecyclerView
dans unScrollView
, je suggérerais de n'en avoir qu'unRecyclerView
qui peut gérer de nombreux types d'enfants.la source
Vous devez d'abord utiliser à la
NestedScrollView
place deScrollView
et mettre l'RecyclerView
intérieurNestedScrollView
.Utilisez la classe de disposition personnalisée pour mesurer la hauteur et la largeur de l'écran:
Et implémentez le code ci-dessous dans l'activité / le fragment de
RecyclerView
:la source
Si RecyclerView n'affiche qu'une seule ligne dans ScrollView. Il vous suffit de définir la hauteur de votre ligne sur
android:layout_height="wrap_content"
.la source
vous pouvez également remplacer LinearLayoutManager pour faire rouler la vue d'ensemble du recyclage en douceur
la source
Désolé d'être en retard à la fête, mais il semble qu'il existe une autre solution qui fonctionne parfaitement pour le cas que vous avez mentionné.
Si vous utilisez une vue de recycleur à l'intérieur d'une vue de recycleur, cela semble fonctionner parfaitement bien. Je l'ai personnellement essayé et utilisé, et il ne semble y avoir aucune lenteur ni aucune secousse du tout. Maintenant, je ne sais pas si c'est une bonne pratique ou non, mais l'imbrication de plusieurs vues de recycleur, même la vue de défilement imbriquée, ralentit. Mais cela semble bien fonctionner. Veuillez essayer. Je suis sûr que la nidification sera parfaitement adaptée à cela.
la source
Une autre approche pour résoudre le problème consiste à utiliser à l'
ConstraintLayout
intérieurScrollView
:Mais je m'en tiendrai toujours à l'
androidx.core.widget.NestedScrollView
approche proposée par Yang Peiyong .la source
** Solution qui a fonctionné pour moi
Utilisez NestedScrollView avec la hauteur comme wrap_content
// Le contenu de votre ligne va ici
la source