RecyclerView vs ListView


295

Du développeur Android ( Création de listes et de cartes ):

Le widget RecyclerView est une version plus avancée et flexible de ListView.

D'accord, ça a l'air cool, mais quand j'ai vu cet exemple d'image, je suis vraiment confus quant à la différence entre ces deux.

entrez la description de l'image ici

L'image ci-dessus peut être facilement créée en ListViewutilisant un adaptateur personnalisé.

Alors, dans quelle situation faut-il utiliser RecyclerView?



1
@ Dev786: Je vous suggère d'ajouter ici un commentaire expliquant en détail ce qui vous semble manquer dans les nombreuses réponses existantes sur cette question.
CommonsWare

Réponses:


374

RecyclerViewa été créé comme une ListViewamélioration, donc oui, vous pouvez créer une liste jointe avec ListViewcontrôle, mais l'utilisation RecyclerViewest plus facile car elle:

  1. Réutilise les cellules tout en faisant défiler vers le haut / bas - cela est possible avec l'implémentation de View Holder dans l' ListViewadaptateur, mais c'était une chose facultative, alors que RecycleViewc'est la façon par défaut d'écrire l'adaptateur.

  2. Découple la liste de son conteneur - vous pouvez donc placer facilement les éléments de la liste au moment de l'exécution dans les différents conteneurs (linearLayout, gridLayout) avec le paramètre LayoutManager.

Exemple:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. Animation des actions de liste commune - Les animations sont découplées et déléguées à ItemAnimator.

Il y a plus RecyclerView, mais je pense que ces points sont les principaux.

Donc, pour conclure, RecyclerViewest un contrôle plus flexible pour le traitement des "données de liste" qui suit les schémas de délégation des préoccupations et ne laisse pour lui qu'une seule tâche - recycler les articles.


16
La responsabilité principale de la vue de liste est 1.) d'organiser visuellement les éléments dans une zone donnée et de préférence 2.) de réutiliser les éléments. Avec RecylerView, cela se divise en responsabilités uniques - recyclez la vue recycle et on lui donne LayoutManager organise les éléments à l'écran. En d'autres termes, la vue de recyclage ne sait pas / ne se soucie pas où placer les éléments à l'écran, elle prend juste soin de les recycler. De la documentation Android: "En modifiant le LayoutManager, un RecyclerView peut être utilisé pour implémenter une liste de défilement vertical standard, une grille uniforme, des grilles décalées, des collections à défilement horizontal et plus."
daneejela

32
"Réutiliser les cellules tout en faisant défiler vers le haut / bas": Pour autant que je sache, c'est complètement faux car cela se produit même dans la vue de liste sans vue.
Ruban

16
L'utilisation principale du support de vue dans listview est que votre code peut appeler findViewById () fréquemment pendant le défilement de ListView, ce qui peut ralentir les performances. Même lorsque l'adaptateur renvoie une vue gonflée pour recyclage, vous devez toujours rechercher les éléments et les mettre à jour. Une manière de contourner l'utilisation répétée de findViewById () consiste à utiliser le modèle de conception "view holder". Un objet ViewHolder stocke chacune des vues de composant dans le champ de balise de la présentation, vous pouvez donc y accéder immédiatement sans avoir besoin de les rechercher à plusieurs reprises.
Ruban

7
Ce que j'essaie de dire, c'est que Row sera recyclé même lorsque vous implémentez listview sans support de vue. C'est la propriété et l'avantage de listview. C'est ce qu'ils ont créé listview.
Ruban

ils n'ont rien fait de spécial, ces fonctionnalités peuvent être ajoutées par n'importe qui. vous pouvez étendre ListView et baseAdapter et y ajouter n'importe quelle fonction si vous le souhaitez. il n'y a en fait aucune différence entre ces deux.
MDP

39

Pour que les vues de liste aient de bonnes performances, vous devez implémenter le modèle de support, et c'est facile à gâcher, surtout lorsque vous souhaitez remplir la liste avec plusieurs types de vues différents.

Le RecyclerView cuit ce modèle, ce qui rend plus difficile à gâcher. Il est également plus flexible, ce qui facilite la gestion de différentes dispositions, qui ne sont pas linéaires, comme une grille.


6
Oui ! , il devrait y avoir plus de discussions sur le moment de NE PAS utiliser recyclerview aussi. Si vos lignes ont un contenu ajouté dynamiquement en fonction des données du modèle et que vous utilisez la vue Recycleur, BOOM.
Rana Deep

1
Vous devriez pouvoir ajouter du contenu dynamique basé sur les données du modèle. Vous aurez juste besoin de configurer différentes vues pour tout type de contenu que vous souhaitez prendre en charge.
CaptRespect

36

ListViewest l'ancêtre de RecyclerView. Il y avait beaucoup de choses qui ListViewne fonctionnaient pas ou qui ne fonctionnaient pas bien. Si vous deviez rassembler les lacunes de la ListViewet résolu le problème en résumant les problèmes dans différents domaines, vous vous retrouveriez avec quelque chose comme la vue du recycleur. Voici les principaux problèmes avec ListViews:

  • N'a pas appliqué la Viewréutilisation pour les mêmes types d'élément (regardez l'un des adaptateurs utilisés dans un ListView, si vous étudiez la méthode getView, vous verrez que rien n'empêche un programmeur de créer une nouvelle vue pour chaque ligne même si une est passée dans via la convertViewvariable)

  • N'a pas empêché coûteux findViewByIdutilisations (Même si vous recyclaient vues comme indiqué plus haut , il était possible pour les devs à appelleraient findViewByIdde mettre à jour le contenu affiché des vues de l' enfant. L'objectif principal du ViewHoldermodèle dans ListViewsétait de mettre en cache les findViewByIdappels. Toutefois , ce fut seulement disponible si vous le saviez car il ne faisait pas partie de la plate-forme du tout)

  • Défilement vertical uniquement pris en charge avec les vues affichées en ligne (la vue Recycler ne se soucie pas de l'endroit où les vues sont placées et de la façon dont elles sont déplacées, elle est abstraite dans un LayoutManager. Un recycleur peut donc prendre en charge le traditionnel ListViewcomme indiqué ci-dessus, ainsi que des choses comme le GridView, mais il ne se limite pas à cela, il peut faire plus, mais vous devez faire le travail de programmation pour y arriver).

  • Les animations à ajouter / supprimer n'étaient pas un cas d'utilisation qui a été pris en compte. C'était à vous de comprendre comment procéder (comparez RecyclerView. Les classes d'adaptateurs notifient les offres de méthode * v ListViews pour avoir une idée).

En bref, RecyclerViewc'est une approche plus flexible de la ListView, bien que davantage de codage puisse être nécessaire de votre part.


20

Le RecyclerViewest un nouveau ViewGroup qui est prêt à restituer n'importe quelle vue basée sur l'adaptateur d'une manière similaire. Il est supposé être le successeur de ListView and GridView, et il peut être trouvé dans le latest support-v7 version. Le RecyclerViewa été développé avec une extensibilité à l'esprit, il est donc possible de créer n'importe quel type de mise en page auquel vous pouvez penser, mais pas sans une petite dose de douleur dans le cul.

Réponse tirée d' Antonio leiva

 compile 'com.android.support:recyclerview-v7:27.0.0'

RecyclerViewest en effet un powerful viewque ListView. Pour plus de détails, vous pouvez visiter cette page .


5
J'aime cette phrase de votre réponse: c'est Android, donc les choses ne sont jamais faciles C'est vrai pour ce que le développement d'applications Android a été, mais je pense que c'est juste quelque chose de mal dans la façon dont ils ont conçu l'API ainsi que les modèles à construire Application Android. Théoriquement, une bonne conception devrait cacher toutes les complexités possibles aux programmeurs (mais être toujours accessible pour les plus avancés), ce qui leur tient généralement à cœur, c'est la logique métier, les données et d'autres algorithmes autres que la difficulté à gérer les problèmes liés à l'interface utilisateur (et les problèmes plus fastidieux actuellement présents dans le développement Android).
Hopeless

18

Voici quelques points / différences clés entre RecyclerView et ListView. Prenez votre appel à bon escient.

Si ListView fonctionne pour vous, il n'y a aucune raison de migrer. Si vous écrivez une nouvelle interface utilisateur, vous pourriez être mieux avec RecyclerView.

RecylerView a intégré ViewHolder, n'a pas besoin d'implémenter le nôtre comme dans listView. Il prend également en charge notifier à un index particulier

Des choses comme animer l'ajout ou la suppression d'éléments sont déjà implémentées dans RecyclerView sans que vous ayez à faire quoi que ce soit

Nous pouvons associer un gestionnaire de disposition à un RecyclerView, cela peut être utilisé pour obtenir des vues aléatoires dans recycleview alors que c'était une limitation dans ListView Dans un ListView, le seul type de vue disponible est le ListView vertical. Il n'y a aucun moyen officiel d'implémenter même un ListView horizontal. 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 les listes décalées, iii) GridLayoutManager - qui prend en charge l'affichage des grilles comme on le voit dans les applications Gallery.

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


14

Avantage majeur :

ViewHoldern'est pas disponible par défaut dans ListView. Nous allons créer explicitement à l'intérieur du getView(). RecyclerViewa intégré Viewholder.


4

En plus des différences ci-dessus, voici quelques autres:

  1. RV sépare la création de la vue et la liaison des données à la vue. Dans LV, vous devez vérifier si convertView est nul ou non pour créer la vue, avant de lui associer des données. Ainsi, en cas de RV, la vue sera créée uniquement lorsque cela est nécessaire, mais en cas de LV, on peut manquer la vérification de convertview et créer une vue à chaque fois.

  2. Basculer entre Grille et Liste est désormais plus facile avec LayoutManager.

  3. Pas besoin de notifier et de mettre à jour tous les éléments, même si un seul élément est modifié.

  4. Il fallait implémenter la mise en cache des vues en cas de LV. Il est fourni par défaut dans RV. (Il existe une différence entre la mise en cache des vues et le recyclage.)

  5. Animations d'objets très faciles en cas de VR.


4

Avantages de RecyclerVoir la liste:

  1. Contient ViewHolder par défaut.

  2. Animations faciles.

  3. Prend en charge les dispositions horizontales, quadrillées et échelonnées

Avantages de listView sur recyclerView:

  1. Diviseur facile à ajouter.

  2. Peut utiliser arrayAdapter intégré pour des listes simples simples

  3. Prise en charge de l'en-tête et du pied de page.

  4. Prend en charge OnItemClickListner.


4
Autant que je sache, vous pouvez facilement ajouter un séparateur à un recyclerView en utilisant recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));après avoir fait quelque chose commerecyclerView = view.findViewById(R.id.feed);
nviens

1
@nviens Pour l'affichage de la liste, vous pouvez ajouter un séparateur, ajuster sa hauteur et changer sa couleur tout en xml lui-même. De plus, l'implémentation actuelle pour le diviseur est juste ok, c'était un cauchemar d'ajouter un diviseur pour recyclerview auparavant, vérifiez simplement cette réponse pour voir comment l'implémentation précédente pour le diviseur était stackoverflow.com/a/27037230/6478047
Manohar Reddy

4

8 différences entre RecyclerView et ListView

Recyclerview vs ListView

1. Modèle ViewHolder

Modèle utilisé pour réduire les appels aux méthodes findViewById () .

Dans ListView, vous pouvez facilement créer une liste sans utiliser ViewHolder. Mais pas dans le cas de RecyclerView.

2. Adaptateur

Les deux sont des AdapterViews, oui. Il fonctionne en fonction de la classe d'adaptateur.

Il est facile de créer ListView à l'aide d'adaptateurs par défaut comme ArrayAdapter, CursorAdapter mais RecyclerView fournit la classe RecyclerView.Adapter, pour créer une nouvelle classe d'adaptateur personnalisée.

Vous ne pouvez pas utiliser ArrayAdapter ou tout autre adaptateur intégré avec RecyclerView.

3. Disposition des articles

J'ai créé Vertical ListView en code simple et moins. Mais que faire si nous devons créer une GridView?

RecyclerView utilise LayoutManager pour organiser ses éléments. Il existe 3 classes LayoutManager.

  • LinearLayoutManager - aide à créer une liste de types linéaires.
  • GridLayoutManager - Utilisé pour créer une grille.
  • StaggeredGridLayoutManager - Utilisé pour créer une grille décalée.

Des animations

ListView manque d'animations de base. Mais RecyclerView est livré avec des animations simples.

Séparateur

Les attributs android: divider et android: dividerHeight ou setDivider (), setDividerHeight () vous aident à créer un séparateur personnalisé dans ListView.

depuis le 25.1.0, vous pouvez utiliser la classe DividerItemDecoration pour créer un diviseur simple.

Cliquez sur Événements

RecyclerView manque OnItemClickListener , oui c'est très triste. Mais ils donnent plus de contrôle au développeur en fournissant RecyclerView.OnItemTouchListener.

Méthodes de notification

Vous devez appeler les méthodes de notification * appropriées pour effectuer des animations correctes. RecylcerView dispose de nombreuses méthodes de notification * lors de la comparaison avec ListView.


3

Je pense que la principale et la plus grande différence qu'ils ont, c'est que ListViewrecherche la position de l'élément lors de la création ou de la mise, d'autre part RecyclerViewcherche le type de l'élément. s'il existe un autre élément créé avec le même type, RecyclerViewne le créez pas à nouveau. Il demande d'abord l'adaptateur et demande ensuite à la piscine recyclée, si la piscine recyclée dit "ouais j'ai créé un type similaire", alors RecyclerViewn'essaye pas de créer le même type. ListViewn'a pas ce type de mécanisme de mise en commun.


2

À mon avis, il a RecyclerViewété fait pour résoudre le problème du modèle de recyclage utilisé dans les listes de visualisation, car cela rendait la vie du développeur plus difficile. Tous les autres que vous pourriez gérer plus ou moins. Par exemple, j'utilise le même adaptateur pour ListViewet GridViewcela n'a pas d'importance dans les deux vues getView, le getItemCount, getTypeCountest utilisé donc c'est la même chose. RecyclerViewn'est pas nécessaire si ListViewavec ListAdapterou GridViewavec des adaptateurs de réseau fonctionne déjà pour vous. Si vous avez correctement implémenté le ViewHoldermodèle dans vos listes de vues, vous ne verrez aucune amélioration majeure RecycleView.


2

J'ai un peu travaillé avec RecyclerViewet je préfère encore ListView.

  1. Bien sûr, les deux utilisent ViewHolders, donc ce n'est pas un avantage.

  2. A RecyclerViewest plus difficile à coder.

  3. A RecyclerViewne contient pas d'en-tête et de pied de page, c'est donc un inconvénient.

  4. A ListViewne nécessite pas de créer un ViewHolder. Dans les cas où vous souhaitez avoir une liste avec des sections ou des sous-en-têtes, ce serait une bonne idée de créer des éléments indépendants (sans ViewHolder), c'est plus facile et ne nécessite pas de classes séparées.


1
vous pouvez faire en-tête et côté contenu dans l'adaptateur de vue d'ensemble et ce sera plus flexible que la vue de liste. juste difficile de changer votre esprit listview à recyclerview mais si vous pouvez le faire, vous comprendrez ce que je veux dire. listview obsolète allez simplement essayer d'apprendre recyclerview goodluck
erginduran

2
@erginduran, j'ai utilisé les deux. ListView est toujours largement utilisé et n'est pas déconseillé. Il gaspille également moins de mémoire que RecyclerView. Si vous souhaitez uniquement remplacer un ListView par RecyclerView, ce ne sera pas une bonne idée.
CoolMind

il suffit de vérifier pourquoi ce gars a développé recyclerview pour? son amélioration de listview, non? il y a beaucoup de vieilles bibliothèques et applications dans google play, donc vous avez raison, la liste est toujours largement utilisée. laissez simplement les vieilles choses dans le passé. vérifier les comparaisons -> lien
erginduran

@erginduran, merci. Vous avez raison, RecyclerView présente certains avantages. Ma réponse concernait les tâches habituelles dans lesquelles un ListView est parfois plus facile qu'un RecyclerView. Bien sûr, l'animation et certaines autres améliorations sont difficiles ou impossibles dans un ListView.
CoolMind

J'ai ajouté quelques aspects dans cette rubrique, voir stackoverflow.com/a/39721769/2914140 .
CoolMind

1
  1. Vous pouvez utiliser une interface pour fournir un écouteur de clics. J'utilise également cette technique avec ListViews.
  2. Pas de séparateur: ajoutez simplement dans votre ligne une vue d'une largeur de match_parent et d'une hauteur de 1dp et donnez-lui une couleur de fond
  3. Utilisez simplement un sélecteur StateList pour l'arrière-plan de la ligne.
  4. addHeaderView peut également être évité dans ListViews: placez simplement l'en-tête en dehors de la vue.

Donc, si l'efficacité est votre préoccupation, alors oui, c'est une bonne idée de remplacer un ListView par un RecyclerView.


0

Réponse simple: vous devez utiliser RecyclerView dans une situation où vous souhaitez afficher de nombreux éléments, et leur nombre est dynamique. ListView ne doit être utilisé que lorsque le nombre d'éléments est toujours le même et est limité à la taille de l'écran.

Vous trouvez cela plus difficile parce que vous ne pensez qu'à la bibliothèque Android.

Aujourd'hui, il existe de nombreuses options qui vous aident à créer vos propres adaptateurs, ce qui facilite la création de listes et de grilles d'éléments dynamiques que vous pouvez sélectionner, réorganiser, utiliser des animations, des séparateurs, ajouter des pieds de page, des en-têtes, etc., etc.

N'ayez pas peur et essayez RecyclerView, vous pouvez commencer à l'aimer en faisant une liste de 100 éléments téléchargés depuis le Web (comme les actualités facebook) dans un ListView et un RecyclerView, vous verrez la différence dans l'UX (utilisateur expérience) lorsque vous essayez de faire défiler, probablement l'application de test s'arrêtera avant même que vous puissiez le faire.

Je vous recommande de vérifier ces deux bibliothèques pour faire des adaptateurs faciles:

FastAdapter par mikepenz

FlexibleAdapter par davideas


1
Je pense que vos déclarations sur la différence de performance entre les deux sont exagérées. J'utilise ListView dans une application de production depuis 2012, affichant jusqu'à 3000 éléments avec ~ 10 vues différentes dans chaque ligne, aucun problème de performance, même sur les anciens appareils Android 2.3.
Magnus W

0

RecyclerVoir les informations

Le a RecyclerViewété introduit avec Android 5.0 (Lollipop). il est inclus dans la bibliothèque de support . Ainsi, il est compatible avec l'API Android de niveau 7.

De la même façon ListView, RecyclerView’sl'idée principale est de fournir des fonctionnalités de référencement d'une manière respectueuse des performances. La partie «recycleur» du nom de cette vue n'est pas là par hasard. Le RecyclerViewpeut réellement recycler les éléments avec lesquels il travaille actuellement. Le processus de recyclage se fait grâce à un motif appelé View Holder .

Avantages et inconvénients de RecyclerView

Avantages:

  • animations intégrées pour ajouter, mettre à jour et supprimer des éléments
  • applique le recyclage des vues à l'aide du modèle ViewHolder
  • prend en charge les grilles et les listes
  • prend en charge le défilement vertical et horizontal
  • peut être utilisé avec DiffUtil

Les inconvénients:

  • ajoute de la complexité
  • aucun OnItemClickListener

ListView info

Il ListViewexiste depuis le tout début d'Android. Il était disponible même en API Level 1et il a le même objectif que leRecyclerView .

L'utilisation de ListView est en fait très simple. Dans cet aspect, ce n'est pas comme son successeur. La courbe d'apprentissage est plus fluide que celle du RecyclerView. Ainsi, il est plus facile à saisir. Nous n'avons pas à gérer des choses comme le LayoutManager, ItemAnimator ou DiffUtil.

Avantages et inconvénients de ListView

Avantages:

  • utilisation simple
  • adaptateurs par défaut
  • disponible OnItemClickListener
  • c'est le fondement du ExpandableListView

Les inconvénients:

  • n'embrasse pas l'utilisation du modèle ViewHolder

0

Il existe de nombreuses différences entre ListView et RecyclerView, mais vous devez être particulièrement attentif aux points suivants:

  • Le modèle ViewHolder est entièrement facultatif dans ListView, mais il est intégré dans RecyclerView.
  • ListView ne prend en charge que le défilement vertical, mais RecyclerView n'est pas limité aux listes à défilement vertical.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.