Android Recyclerview vs ListView avec Viewholder

je suis récemment tombé sur l'android RecycleView qui a été publié avec Android 5.0 et il semble que RecycleView est juste un encapsulé traditionnel ListView avec le motif de porte-Vue intégré dans elle, ce qui favorise la réutilisation de la vue, plutôt que la création à chaque fois.

Quels sont les autres avantages d'utiliser RecycleView ? Si les deux ont le même effet en termes de performance, 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 de 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?

112
demandé sur Community 2015-02-15 13:24:02

5 réponses

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

1) Motif De Porte-Vues

dans un ListView, il a été recommandé d'utiliser le motif des afficheurs, mais ce n'était jamais une contrainte. En cas de RecyclerView, c'est obligatoire en utilisant le RecyclerView.Titulaire de la vue catégorie. C'est l'une des principales différences 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

il s'agit d'une autre amélioration massive apportée à la RecyclerView. Dans un ListView, le seul type de vue disponible est le ListView vertical. Il n'y a même pas de moyen officiel de mettre en œuvre une ListView horizontale.

maintenant en utilisant un RecyclerView, nous pouvons avoir un

i) LinearLayoutManager - qui supporte les listes verticales et horizontales,

ii) StaggeredLayoutManager - qui supporte Pinterest comme des listes décalées,

iii) GridLayoutManager - qui supporte l'affichage des grilles comme vu dans les applications Gallery.

et la meilleure chose est que nous pouvons faire tout cela dynamiquement comme nous le voulons.

3) Article Animateur

Les ListViews

manquent de support pour les bonnes animations, mais la RecyclerView apporte une toute nouvelle dimension à celle-ci. En utilisant le RecyclerView.Classe d'animation les vues deviennent tellement faciles et intuitives.

4) Article Décoration

dans le cas des ListViews, il n'a jamais été facile de décorer dynamiquement des objets comme l'ajout de bordures ou de séparateurs. Mais dans le cas de RecyclerView, la RecyclerView.La classe ItemDecorator donne un contrôle énorme aux développeurs, mais rend les choses un peu plus longues et complexes.

5) OnItemTouchListener

intercepter les clics d'objets sur un ListView était simple, grâce à son AdapterView .Onitemclicklistener interface. Mais le RecyclerView donne beaucoup plus de puissance et de contrôle à ses développeurs par le 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 puissance à ses développeurs.

236
répondu Aritra Roy 2015-07-03 06:03:19

OK si peu de creuser et j'ai trouvé ces gemmes de Bill Philips article sur RecycleView

RecyclerView peut faire plus que ListView, mais la catégorie elle-même a moins de responsabilités que ListView. Hors de la boîte, RecyclerView n'est pas:

  • la Position des éléments sur l'écran
  • Animer les points de vue
  • poignée tous les événements tactiles sauf le défilement

toutes ces choses ont été cuites à ListView, mais RecyclerView utilise classes de collaborateurs pour faire ces travaux à la place.

les afficheurs que vous créez sont aussi plus beaux. Ils sous-classe RecyclerView.ViewHolder , qui a un tas de méthodes RecyclerView utiliser. ViewHolders savoir à quelle position ils sont actuellement liés, comme ainsi que quel ID d'article (si vous avez ces). Dans le processus, ViewHolder a été anobli. C'était le travail de ListView de s'accrocher à la vue d'ensemble de l'article, et ViewHolder seulement tenu à de petits morceaux de celui-ci.

maintenant, le titulaire de la vue s'accroche à tout cela dans le ViewHolder.itemView champ, qui est assigné dans le constructeur de ViewHolder pour vous.

8
répondu Mushtaq Jameel 2015-02-15 15:15:46

L'autre plus de l'utilisation de RecycleView est l'animation, il peut être fait en deux lignes de code

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

mais le widget est encore cru, E. g vous ne pouvez pas créer en-tête et pied de page .

8
répondu Etun 2016-09-28 14:22:38

plus de 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 clics: les vues individuelles devraient-elles gérer ces événements, ou la ListView devrait-elle les gérer par L'Intermédiaire d'OnItemClickListener? Dans RecyclerView, cependant, le titulaire de la vue est dans une position claire pour agir comme un objet de contrôleur de niveau de rangée qui traite sortes de détails.

nous avons vu plus tôt que LayoutManager manipulait les vues de positionnement, et ItemAnimator les animait. ViewHolder est le dernier élément: il est responsable de gérer tous les événements qui se produisent sur un article spécifique que RecyclerView affiche.

4
répondu Jaison Brooks 2015-02-19 15:40:45

j'ai utilisé un ListView avec Glide image loader, ayant la croissance de la mémoire. Puis j'ai remplacé le ListView par un RecyclerView . Il est non seulement plus difficile dans le codage, mais conduit également à une utilisation de mémoire plus 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 d'entrée peut varier, aussi un TextWatcher peut être appliqué. Si j'ai utilisé un ViewHolder , Comment pourrais-je remplacer un TextWatcher pendant le défilement? Donc, j'ai utilisé un ListView sans ViewHolder , et ça fonctionne.

3
répondu CoolMind 2016-09-28 13:57:45