Partager via


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 un RecyclerView. L’adaptateur signale également les événements de clic d’élément.

  • LayoutManager : mesure et positionne les vues d’éléments dans un RecyclerView 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 RecyclerViewclasses , LayoutManageret Adapter est représentée dans le diagramme suivant :

Diagramme de RecyclerView contenant LayoutManager, à l’aide de l’adaptateur pour accéder au jeu de données

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 RecyclerViewcompte 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 le RecyclerView. L’adaptateur sait comment associer chaque position d’affichage d’élément dans le RecyclerView à 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 :

Diagramme illustrant les six étapes du recyclage des vues

  1. Lorsqu’une vue défile hors de vue et n’est plus affichée, elle devient une vue de récupération.

  2. 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.

  3. 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.

  4. 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.

  5. 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 .

  6. 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 :

  1. Sous-classe RecyclerView.ViewHolder.
  2. Implémentez un constructeur qui recherche et stocke les références d’affichage.
  3. 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

Diagramme illustrant l’adaptateur qui connecte la source de données à ViewHolders

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 ImageViewTextView à 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.