J'ai du mal à comprendre setHasFixedSize()
. Je sais qu'il est utilisé pour l'optimisation lorsque la taille de RecyclerView
ne change pas, d'après les documents.
Mais qu'est-ce que cela signifie? Dans la plupart des cas, un a ListView
presque toujours une taille fixe. Dans quels cas ne serait-ce pas une taille fixe? Cela signifie-t-il que l'immobilier réel qu'il occupe à l'écran grandit avec le contenu?
android
android-5.0-lollipop
android-recyclerview
SIr Codealot
la source
la source
Réponses:
Une version très simplifiée de RecyclerView a:
Ce lien explique pourquoi les appels
requestLayout
peuvent être coûteux. Fondamentalement, chaque fois que des éléments sont insérés, déplacés ou supprimés, la taille (largeur et hauteur) de RecyclerView peut changer et, à son tour, la taille de toute autre vue dans la hiérarchie des vues peut changer. Ceci est particulièrement gênant si des éléments sont ajoutés ou supprimés fréquemment.Évitez les passes de mise en page inutiles en définissant
setHasFixedSize
sur true lorsque la modification du contenu de l'adaptateur ne modifie ni sa hauteur ni sa largeur.Mise à jour: Le JavaDoc a été mis à jour pour mieux décrire ce que fait réellement la méthode.
la source
requestLayout
ou non une fois que le dataSet a été mis à jour.Peut confirmer
setHasFixedSize
concerne le RecyclerView lui-même, et non la taille de chaque élément qui lui est adapté.Vous pouvez maintenant utiliser
android:layout_height="wrap_content"
sur un RecyclerView, qui, entre autres, permet à un CollapsingToolbarLayout de savoir qu'il ne doit pas se réduire lorsque le RecyclerView est vide. Cela ne fonctionne que lorsque vous utilisezsetHasFixedSize(false)
sur le RecylcerView.Si vous utilisez
setHasFixedSize(true)
sur le RecyclerView, ce comportement pour empêcher le CollapsingToolbarLayout de se réduire ne fonctionne pas, même si le RecyclerView est effectivement vide.Si
setHasFixedSize
était lié à la taille des éléments, cela ne devrait avoir aucun effet lorsque RecyclerView ne contient aucun élément.la source
setHasFixedSize(true)
pour les agrandir lorsque de nouveaux éléments sont ajoutés.hasFixedSize: set to true if adapter changes cannot affect the size of the RecyclerView.
donc même si la taille de l'élément change, vous pouvez toujours définir cela sur true.Le ListView avait une fonction nommée similaire qui, je pense, reflétait des informations sur la taille des hauteurs individuelles des éléments de liste. La documentation de RecyclerView indique clairement qu'il fait référence à la taille du RecyclerView lui-même, et non à la taille de ses éléments.
À partir du commentaire source de RecyclerView au-dessus de la méthode setHasFixedSize ():
la source
Wen nous avons mis
setHasFixedSize(true)
surRecyclerView
ce que les moyens de taille recycleur est fixe et n'est pas affectée par le contenu de l' adaptateur. Et dans ce cas, ilonLayout
n'est pas appelé sur recycleur lorsque nous mettons à jour les données de l'adaptateur (mais il y a une exception).Passons à l'exemple:
RecyclerView
a uneRecyclerViewDataObserver
( trouver l'implemntation par défaut dans ce fichier ) avec plusieurs méthodes, la principale importante est:Cette méthode est appelée si nous fixons
setHasFixedSize(true)
et mettre à jour les données d'un adaptateur via:notifyItemRangeChanged, notifyItemRangeInserted, notifyItemRangeRemoved or notifyItemRangeMoved
. Dans ce cas, il n'y a pas d'appels au recycleuronLayout
, mais il y a des appels àrequestLayout
pour mettre à jour les enfants.Mais si nous définissons
setHasFixedSize(true)
et mettons à jour les données d'un adaptateur via,notifyItemChanged
il y a un appel àonChange
la valeur par défaut du recycleurRecyclerViewDataObserver
et aucun appel àtriggerUpdateProcessor
. Dans ce cas, le recycleuronLayout
est appelé chaque fois que nous définissonssetHasFixedSize
true
oufalse
.Comment vérifier par vous-même:
Créer une personnalisation
RecyclerView
et remplacer:Définissez la taille du recycleur sur
match_parent
(en xml). Essayez de mettre à jour les données de l'adaptateur en utilisantreplaceData
etreplaceOne
avec la configurationsetHasFixedSize(true)
, puisfalse
.Et vérifiez votre journal.
Mon journal:
Résumer:
Si nous définissons
setHasFixedSize(true)
et mettons à jour les données de l'adaptateur en notifiant un observateur d'une autre manière que l'appelnotifyDataSetChanged
, alors vous avez des performances, car il n'y a pas d'appels à laonLayout
méthode de recyclage .la source
Si nous avons un
RecyclerView
avecmatch_parent
comme hauteur / largeur , nous devons ajoutersetHasFixedSize(true)
car la taille deRecyclerView
lui-même ne change pas l'insertion ou la suppression d'éléments.setHasFixedSize doit être false si nous avons un RecyclerView avec
wrap_content
comme hauteur / largeur puisque chaque élément inséré par l'adaptateur pourrait changer la taille du enRecycler
fonction des éléments insérés / supprimés, donc, la taille duRecycler
sera différente à chaque fois que nous ajoutons / supprimons articles.Pour être plus clair, si nous utilisons
On peut utiliser
my_recycler_view.setHasFixedSize(true)
Nous devrions utiliser
my_recycler_view.setHasFixedSize(false)
, cela s'applique si nous utilisons égalementwrap_content
comme largeurla source
setHasFixedSize (true) signifie que RecyclerView a des enfants (éléments) qui ont une largeur et une hauteur fixes. Cela permet au RecyclerView de mieux optimiser en déterminant la hauteur et la largeur exactes de la liste entière en fonction de votre adaptateur.
la source
Cela affecte les animations de la vue de recyclage, si c'est
false
.. les animations d'insertion et de suppression ne s'afficheront pas. alors assurez-vous que c'esttrue
au cas où vous avez ajouté une animation pour la vue de recyclage.la source
Si la taille du RecyclerView (le RecyclerView lui-même)
... ne dépend pas du contenu de l'adaptateur:
... dépend du contenu de l'adaptateur:
la source