Android Recyclerview vs ListView avec Viewholder

Récemment, je suis tombé sur l’Android RecycleView qui était sorti avec Android 5.0 et il semble que RecycleView est juste un ListView traditionnel encapsulé avec le modèle ViewHolder intégré, ce qui favorise la réutilisation de la vue, plutôt que de la créer à chaque fois.

Quels sont les autres avantages de l’utilisation de RecycleView ? Si les deux ont le même effet en termes de performances, pourquoi choisirait-on d’utiliser RecycleView`?

modifier

J’ai trouvé que les gens ont posé des questions similaires et les réponses ne sont pas concluantes, les ajoutant ici pour la tenue des dossiers.

Recyclerview vs Listview

Devrions-nous utiliser RecyclerView pour remplacer ListView?

Pourquoi RecyclerView n’a-t-il pas onItemClickListener ()? et Comment RecyclerView est différent de Listview?

Avec l’avènement d’Android Lollipop, le RecyclerView a officiellement fait son chemin. RecyclerView est beaucoup plus puissant, flexible et constitue une amélioration majeure par rapport à ListView . Je vais essayer de vous donner un aperçu détaillé.

1) Motif ViewHolder

Dans un ListView, il était recommandé d’utiliser le modèle ViewHolder mais ce n’était jamais une contrainte. Dans le cas de RecyclerView, cela est obligatoire en utilisant la classe RecyclerView.ViewHolder . C’est l’une des différences majeures entre ListView et RecyclerView.

Cela rend les choses un peu plus complexes dans RecyclerView, mais beaucoup de problèmes que nous avons rencontrés dans ListView sont résolus efficacement.

2) LayoutManager

Ceci est une autre amélioration massive apscope à RecyclerView. Dans un ListView, le seul type de vue disponible est le ListView vertical. Il n’y a pas de moyen officiel d’implémenter une ListView horizontale.

Maintenant, en utilisant un RecyclerView, nous pouvons avoir un

i) LinearLayoutManager – qui prend en charge les listes verticales et horizontales,

ii) StaggeredLayoutManager – qui prend en charge Pinterest comme des listes échelonnées,

iii) GridLayoutManager – qui prend en charge l’affichage des grids comme indiqué dans les applications de la galerie.

Et la meilleure chose est que nous pouvons faire tout cela dynamicment comme nous le souhaitons.

3) Animateur d’items

Les ListViews manquent de support pour de bonnes animations, mais RecyclerView apporte une toute nouvelle dimension. En utilisant la classe RecyclerView.ItemAnimator , l’animation des vues devient tellement simple et intuitive.

4) Décoration de l’article

Dans le cas de ListViews, la décoration dynamic d’éléments comme l’ajout de bordures ou de séparateurs n’a jamais été facile. Mais dans le cas de RecyclerView, la classe RecyclerView.ItemDecorator donne un énorme contrôle aux développeurs mais rend les choses un peu plus longues et complexes.

5) OnItemTouchListener

L’interception des clics d’éléments sur un ListView était simple, grâce à son interface AdapterView.OnItemClickListener . Mais RecyclerView donne beaucoup plus de puissance et de contrôle à ses développeurs grâce à RecyclerView.OnItemTouchListener, mais cela complique un peu les choses pour le développeur.

En termes simples, le RecyclerView est beaucoup plus personnalisable que le ListView et donne beaucoup de contrôle et de puissance à ses développeurs.

Okay si peu de creuser et j’ai trouvé ces gemmes de l’ article de Bill Philips sur RecycleView

RecyclerView peut faire plus que ListView, mais la classe RecyclerView elle-même a moins de responsabilités que ListView. RecyclerView n’est pas prêt à l’emploi:

  • Positionner des éléments sur l’écran
  • Animer des vues
  • Gérer tous les événements tactiles en dehors du défilement

Tous ces éléments ont été intégrés à ListView, mais RecyclerView utilise des classes de collaborateur pour effectuer ces tâches à la place.

Les ViewHolders que vous créez sont également plus robustes. Ils sous-classe RecyclerView.ViewHolder , qui a un tas de méthodes utilisées par RecyclerView . ViewHolders connaissent la position à laquelle ils sont actuellement liés, ainsi que les identifiants d’éléments (si vous en avez). En cours de ViewHolder , ViewHolder a été ViewHolder . Auparavant, le travail de ListView consistait à conserver la vue entière de l’élément, et ViewHolder n’en conservait que peu.

Maintenant, ViewHolder conserve tout cela dans le champ ViewHolder.itemView , qui est assigné dans le constructeur de ViewHolder pour vous.

L’autre avantage de RecycleView est l’animation, cela peut se faire en deux lignes de code.

 RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator(); recyclerView.setItemAnimator(itemAnimator); 

Mais le widget est toujours brut, par exemple, vous ne pouvez pas créer d’en- tête et de pied de page .

Plus de l’ article de Bill Phillip (allez le lire!) Mais j’ai pensé qu’il était important de souligner ce qui suit.

Dans ListView, il y avait une certaine ambiguïté sur la façon de gérer les événements de clic: Les vues individuelles devraient-elles gérer ces événements ou le contrôle ListView devrait-il les gérer via OnItemClickListener? Dans RecyclerView, cependant, le ViewHolder est en position claire pour agir en tant qu’object du contrôleur de niveau ligne qui gère ces types de détails.

Nous avons vu précédemment que LayoutManager gérait les vues de positionnement, et ItemAnimator les animait. ViewHolder est le dernier élément: il est responsable du traitement des événements survenant sur un élément spécifique affiché par RecyclerView.

J’ai utilisé un chargeur d’images ListView with Glide, ayant une croissance de mémoire. Ensuite, j’ai remplacé le ListView par un RecyclerView . Ce n’est pas seulement plus difficile dans le codage, mais cela conduit également à une utilisation de la mémoire plus importante qu’un ListView . Au moins dans mon projet.

Dans une autre activité, j’ai utilisé une liste complexe avec EditText's . Dans certains d’entre eux, une méthode de saisie peut varier, un TextWatcher peut également être appliqué. Si j’ai utilisé un ViewHolder , comment pourrais-je remplacer un TextWatcher pendant le défilement? J’ai donc utilisé un ListView sans ViewHolder et ça marche.