Composants et fonctionnalités RecyclerView
RecyclerView
gère certaines tâches en interne (telles que le défilement et le recyclage des vues), mais il s’agit essentiellement d’un gestionnaire qui coordonne les classes d’assistance pour afficher une collection.
RecyclerView
délègue les tâches aux classes d’assistance suivantes :
Adapter
: gonfle les dispositions d’élément (instancie le contenu d’un fichier de disposition) et lie les données aux vues affichées dans unRecyclerView
. L’adaptateur signale également les événements de clic d’élément.LayoutManager
: mesure et positionne les vues d’éléments dans unRecyclerView
et gère la stratégie de recyclage des vues.ViewHolder
: recherche et stocke les références d’affichage. Le porte-vue permet également de détecter les clics d’affichage d’élément.ItemDecoration
: permet à une application d’ajouter des décalages spéciaux de dessin et de disposition à des vues spécifiques pour les séparateurs de dessin entre les éléments, les surbrillances et les limites de regroupement visuel.ItemAnimator
: définit les animations qui se produisent pendant les actions d’élément ou lorsque des modifications sont apportées à l’adaptateur.
La relation entre les RecyclerView
classes , LayoutManager
et Adapter
est représentée dans le diagramme suivant :
Comme l’illustre cette figure, le LayoutManager
peut être considéré comme l’intermédiaire entre et Adapter
.RecyclerView
Effectue des LayoutManager
appels à Adapter
des méthodes pour le RecyclerView
compte du . Par exemple, appelle LayoutManager
une Adapter
méthode lorsqu’il est temps de créer une vue pour une position d’élément particulière dans le RecyclerView
. le Adapter
augmente la disposition de cet élément et crée une ViewHolder
instance (non affichée) pour mettre en cache les références aux vues à cette position. Lorsque le LayoutManager
appelle Adapter
pour lier un élément particulier au jeu de données, le Adapter
localise les données de cet élément, les récupère à partir du jeu de données et les copie dans la vue d’élément associée.
Lors de l’utilisation RecyclerView
dans votre application, la création de types dérivés des classes suivantes est requise :
RecyclerView.Adapter
: fournit une liaison à partir du jeu de données de votre application (qui est spécifique à votre application) aux affichages d’éléments affichés dans leRecyclerView
. L’adaptateur sait comment associer chaque position d’affichage d’élément dans leRecyclerView
à un emplacement spécifique dans la source de données. En outre, l’adaptateur gère la disposition du contenu dans chaque affichage d’élément individuel et crée le porte-vue pour chaque vue. L’adaptateur signale également les événements de clic d’élément détectés par l’affichage d’élément.RecyclerView.ViewHolder
: met en cache les références aux vues dans votre fichier de disposition d’élément afin que les recherches de ressources ne soient pas répétées inutilement. Le détenteur d’affichage organise également le transfert des événements de clic d’élément à l’adaptateur lorsqu’un utilisateur appuie sur l’affichage d’élément associé au titulaire de l’affichage.RecyclerView.LayoutManager
: positionne les éléments dans .RecyclerView
Vous pouvez utiliser l’un des plusieurs gestionnaires de disposition prédéfinis ou implémenter votre propre gestionnaire de disposition personnalisé.RecyclerView
délègue la stratégie de disposition au gestionnaire de disposition, ce qui vous permet de brancher un autre gestionnaire de disposition sans avoir à apporter de modifications significatives à votre application.
En outre, vous pouvez éventuellement étendre les classes suivantes pour modifier l’apparence de RecyclerView
votre application :
RecyclerView.ItemDecoration
RecyclerView.ItemAnimator
Si vous n’étendez ItemDecoration
pas et ItemAnimator
, RecyclerView
utilise les implémentations par défaut. Ce guide n’explique pas comment créer des classes personnalisées ItemDecoration
et ItemAnimator
; pour plus d’informations sur ces classes, consultez RecyclerView.ItemDecoration et RecyclerView.ItemAnimator.
Fonctionnement de l’affichage du recyclage
RecyclerView
n’alloue pas d’affichage d’élément pour chaque élément de votre source de données. Au lieu de cela, il alloue uniquement le nombre d’affichages d’éléments qui s’affichent à l’écran et réutilise ces dispositions au fur et à mesure que l’utilisateur défile. Lorsque la vue défile pour la première fois hors de vue, elle passe par le processus de recyclage illustré dans la figure suivante :
Lorsqu’une vue défile hors de vue et n’est plus affichée, elle devient une vue de récupération.
La vue scrap est placée dans un pool et devient une vue recyclage. Ce pool est un cache de vues qui affichent le même type de données.
Lorsqu’un nouvel élément doit être affiché, une vue est extraite du pool de recyclages pour réutilisation. Étant donné que cette vue doit être re-liée par l’adaptateur avant d’être affichée, elle est appelée vue sale.
La vue sale est recyclée : l’adaptateur localise les données de l’élément suivant à afficher et copie ces données dans les vues de cet élément. Les références pour ces vues sont récupérées à partir du porte-vue associé à la vue recyclée.
La vue recyclée est ajoutée à la liste des éléments du qui sont sur le point d’être affichés à l’écran
RecyclerView
.La vue recyclée s’affiche à l’écran lorsque l’utilisateur fait défiler jusqu’à
RecyclerView
l’élément suivant de la liste. Pendant ce temps, une autre vue défile hors de vue et est recyclée en fonction des étapes ci-dessus.
En plus de la réutilisation de l’affichage élément, RecyclerView
utilise également une autre optimisation de l’efficacité : les détenteurs de vues. Un porte-vue est une classe simple qui met en cache les références d’affichage. Chaque fois que l’adaptateur augmente un fichier de disposition d’élément, il crée également un porte-vue correspondant. Le support d’affichage utilise FindViewById
pour obtenir des références aux vues à l’intérieur du fichier de disposition d’élément gonflé. Ces références sont utilisées pour charger de nouvelles données dans les vues chaque fois que la disposition est recyclée pour afficher de nouvelles données.
Gestionnaire de disposition
Le gestionnaire de disposition est responsable du positionnement des éléments dans l’affichage RecyclerView
; il détermine le type de présentation (une liste ou une grille), l’orientation (si les éléments sont affichés verticalement ou horizontalement) et la direction dans laquelle les éléments doivent être affichés (dans l’ordre normal ou dans l’ordre inverse). Le gestionnaire de disposition est également chargé de calculer la taille et la position de chaque élément dans l’affichage RecycleView .
Le gestionnaire de disposition a un objectif supplémentaire : il détermine la stratégie de recyclage des affichages d’éléments qui ne sont plus visibles par l’utilisateur. Étant donné que le gestionnaire de disposition sait quelles vues sont visibles (et celles qui ne le sont pas), il est dans la meilleure position pour décider quand une vue peut être recyclée. Pour recycler une vue, le gestionnaire de disposition effectue généralement des appels à l’adaptateur pour remplacer le contenu d’une vue recyclée par des données différentes, comme décrit précédemment dans Fonctionnement de l’affichage recyclage.
Vous pouvez étendre RecyclerView.LayoutManager
pour créer votre propre gestionnaire de disposition ou utiliser un gestionnaire de disposition prédéfini.
RecyclerView
fournit les gestionnaires de disposition prédéfinis suivants :
LinearLayoutManager
: organise les éléments d’une colonne qui peuvent faire l’objet d’un défilement vertical ou d’une ligne qui peut être défilée horizontalement.GridLayoutManager
: affiche les éléments d’une grille.StaggeredGridLayoutManager
: affiche les éléments dans une grille décalée, où certains éléments ont des hauteurs et des largeurs différentes.
Pour spécifier le gestionnaire de disposition, instanciez le gestionnaire de disposition que vous avez choisi et passez-le à la SetLayoutManager
méthode . Notez que vous devez spécifier le gestionnaire de disposition : RecyclerView
ne sélectionne pas un gestionnaire de disposition prédéfini par défaut.
Pour plus d’informations sur le gestionnaire de disposition, consultez la référence de la classe RecyclerView.LayoutManager.
Le titulaire de l’affichage
Le titulaire d’affichage est une classe que vous définissez pour la mise en cache des références d’affichage. L’adaptateur utilise ces références d’affichage pour lier chaque vue à son contenu. Chaque élément du RecyclerView
a un titulaire d’affichage associé instance qui met en cache les références d’affichage pour cet élément. Pour créer un détenteur d’affichage, procédez comme suit pour définir une classe qui contiendra l’ensemble exact de vues par élément :
- Sous-classe
RecyclerView.ViewHolder
. - Implémentez un constructeur qui recherche et stocke les références d’affichage.
- Implémentez les propriétés que l’adaptateur peut utiliser pour accéder à ces références.
Un exemple détaillé d’une ViewHolder
implémentation est présenté dans Un exemple RecyclerView de base.
Pour plus d’informations sur RecyclerView.ViewHolder
, consultez la référence de la classe RecyclerView.ViewHolder.
Adaptateur
La plupart des tâches lourdes du code d’intégration RecyclerView
ont lieu dans l’adaptateur.
RecyclerView
nécessite que vous fournissiez un adaptateur dérivé de pour accéder à votre source de RecyclerView.Adapter
données et remplir chaque élément avec le contenu de la source de données.
Étant donné que la source de données est spécifique à l’application, vous devez implémenter des fonctionnalités d’adaptateur qui comprennent comment accéder à vos données. L’adaptateur extrait les informations de la source de données et les charge dans chaque élément de la RecyclerView
collection.
Le dessin suivant illustre la façon dont l’adaptateur mappe le contenu d’une source de données par le biais de supports d’affichage à des affichages individuels au sein de chaque élément de ligne dans :RecyclerView
L’adaptateur charge chaque RecyclerView
ligne avec les données d’un élément de ligne particulier. Pour la position de ligne P, par exemple, l’adaptateur localise les données associées à la position P dans la source de données et copie ces données dans l’élément de ligne à la position P dans la RecyclerView
collection.
Dans le dessin ci-dessus, par exemple, l’adaptateur utilise le porte-vue pour rechercher les références pour et ImageView
TextView
à cette position afin qu’il n’ait pas à appeler FindViewById
ces vues à plusieurs reprises lorsque l’utilisateur fait défiler la collection et réutilise les vues.
Lorsque vous implémentez un adaptateur, vous devez remplacer les méthodes suivantes RecyclerView.Adapter
:
OnCreateViewHolder
: instancie le fichier de disposition d’élément et le porte-vue.OnBindViewHolder
: charge les données à la position spécifiée dans les vues dont les références sont stockées dans le support de vue donné.ItemCount
: retourne le nombre d’éléments dans la source de données.
Le gestionnaire de disposition appelle ces méthodes pendant qu’il positionne des éléments dans le RecyclerView
.
Notification à RecyclerView des modifications de données
RecyclerView
ne met pas automatiquement à jour son affichage lorsque le contenu de sa source de données change ; l’adaptateur doit avertir RecyclerView
en cas de modification du jeu de données. Le jeu de données peut changer de plusieurs façons ; par exemple, le contenu d’un élément peut changer ou la structure globale des données peut être modifiée.
RecyclerView.Adapter
fournit un certain nombre de méthodes que vous pouvez appeler afin de RecyclerView
répondre aux modifications de données de la manière la plus efficace possible :
NotifyItemChanged
: indique que l’élément à la position spécifiée a changé.NotifyItemRangeChanged
: indique que les éléments de la plage de positions spécifiée ont changé.NotifyItemInserted
: indique que l’élément à la position spécifiée a été récemment inséré.NotifyItemRangeInserted
: indique que les éléments de la plage de positions spécifiée ont été nouvellement insérés.NotifyItemRemoved
: indique que l’élément à la position spécifiée a été supprimé.NotifyItemRangeRemoved
: indique que les éléments de la plage de positions spécifiée ont été supprimés.NotifyDataSetChanged
: indique que le jeu de données a changé (force une mise à jour complète).
Si vous savez exactement comment votre jeu de données a changé, vous pouvez appeler les méthodes appropriées ci-dessus pour actualiser RecyclerView
de la manière la plus efficace possible. Si vous ne savez pas exactement comment votre jeu de données a changé, vous pouvez appeler NotifyDataSetChanged
, ce qui est beaucoup moins efficace, car RecyclerView
doit actualiser toutes les vues visibles par l’utilisateur. Pour plus d’informations sur ces méthodes, consultez RecyclerView.Adapter.
Dans la rubrique suivante, Un exemple de recyclerView de base, un exemple d’application est implémenté pour illustrer des exemples de code réels des composants et des fonctionnalités décrits ci-dessus.