web-dev-qa-db-fra.com

Devrions-nous utiliser RecyclerView pour remplacer ListView?

Les documents Android disent:

Le widget RecyclerView est une version plus avancée et plus flexible de ListView. Ce widget est un conteneur permettant d'afficher des ensembles de données volumineux sur lesquels il est possible de faire défiler le contenu de manière très efficace en conservant un nombre limité de vues. Utilisez le widget RecyclerView lorsque vous disposez de collections de données dont les éléments changent au moment de l'exécution en fonction de l'action de l'utilisateur ou des événements réseau.

En fait, ListView peut faire tout ce qui précède si l'efficacité ne compte pas et nous avons constaté de nombreux problèmes lorsque nous utilisons RecyclerView pour remplacer ListView:

  1. Il n'y a pas onItemClickListener () pour la sélection des éléments de la liste - solution

  2. Pas de séparateur entre les éléments de la liste - solution

  3. Aucun sélecteur de chevauchement intégré, il n'y a pas de retour visuel lorsque vous cliquez sur un élément de la liste - solution

  4. Non addHeaderView pour en-tête de liste - solution

Peut-être plus de problèmes ...

Ainsi, lorsque nous utilisons RecyclerView pour remplacer ListView, nous devons faire beaucoup de codage supplémentaire pour obtenir le même effet que ListView.

QUESTION:

  • Vaut-il la peine de remplacer ListView par RecyclerView totalement?
  • sinon, dans quel cas devrions-nous mieux utiliser RecyclerView à la place ListView, et vice versa?
225
Xcihnegn

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

RecyclerView est puissant lorsque vous devez personnaliser votre liste ou si vous souhaitez de meilleures animations. Ces méthodes pratiques de ListView ont causé beaucoup de problèmes aux utilisateurs, raison pour laquelle RecyclerView leur fournit une solution plus flexible.

Le principal changement à effectuer pour la migration réside dans votre adaptateur. Si vous souhaitez continuer à appeler notifyDataSetChanged, vous perdez la plupart des avantages liés à l'animation et à la reliure. Mais si vous pouvez modifier votre adaptateur pour envoyer des événements de notification détaillés (ajoutés/supprimés/déplacés/mis à jour), vous obtenez des animations et des performances bien meilleures. Ces événements permettent à RecyclerView de choisir les animations correctes et d'éviter les appels inutiles onBind. Vous obtiendrez un avantage énorme si les vues de vos articles sont complexes. En outre, à l'avenir, il y aura plus de composants autour de RecyclerView.

117
yigit

Selon moi, si ListView répond à tous les besoins actuels de votre application et à tous les cas d'utilisation, il n'est pas nécessaire de le remplacer par un RecyclerView.

RecyclerView donne une énorme puissance à ses développeurs au prix d’une complexité accrue pour les développeurs. Certaines choses qui pourraient être facilement effectuées dans un ListView peuvent maintenant demander beaucoup d'efforts inutiles.

Mais oui, il y a beaucoup de choses qu'un ListView ne peut jamais faire, comme l'étonnante fonctionnalité LayoutManager qui peut vous permettre de changer dynamiquement la mise en page en horizontale, verticale, grille ou grille décalée.

J'ai écrit une réponse détaillée sur ce sujet ici .

23
Aritra Roy

1 Vous pouvez utiliser une interface pour fournir un écouteur de clic. J'utilise aussi cette technique avec ListViews.
2 Pas de séparateur: Ajoutez simplement dans votre ligne une vue avec une largeur de match_parent et une hauteur de 1dp et donnez-la a couleur de fond.
Utilisez simplement un sélecteur StateList pour l’arrière-plan de la ligne.
4 addHeaderView peut également être évité dans ListViews: mettez simplement l'en-tête extérieur 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.

8
Fantômas

Jusqu'à récemment, j'utilisais encore ListView pour des listes très simples. Par exemple, si je veux afficher une simple liste d'options de texte ...

J'ai fondé cette décision sur des "facteurs humains", à savoir que créer un simple ListView avec moins de code est préférable si les performances sont immatérielles. Je pense souvent à un professeur d'université qui disait: "Mon professeur, le grand Niclaus Wirth, l'inventeur de Pascal, avait l'habitude de dire que si un programme comptait plus de 50 lignes de code, il était certain qu'il se trompait ..."

Mais ce qui m’a convaincu d’arrêter d’utiliser ListView, c’est qu’il a récemment été transféré dans la catégorie "Héritage" de l’outil de conception de studio Android avec RelativeLayout.

https://developer.Android.com/reference/Android/widget/ListView

Je pense que c'est une forme "douce" de "dépréciation". Ce serait trop perturbant s'il était réellement déconseillé et que tous les développeurs consciencieux transféraient leur code dans RecyclerView.

En outre, l'intro de ListView indique tout au haut que RecyclerView est une meilleure option: "Pour une approche plus moderne, flexible et performante de l'affichage des listes, utilisez RecyclerView."
https://developer.Android.com/reference/Android/widget/ListView

De plus, le guide de ListView parle toujours des chargeurs de curseur, mais getSupportCursorLoader () lui-même vient d'être obsolète dans l'API 28.
https://developer.Android.com/guide/topics/ui/layout/listview

Améliorations récentes apportées à Android Studio:

Fichier -> Nouveau -> Fragment -> Fragment (Liste)

Cela nous donne un RecylerView entièrement fonctionnel, rempli de texte de base. Cela élimine ma dernière vraie raison d’utiliser ListView, car il est désormais tout aussi facile de configurer un RecylerView de base.

En résumé, je n’ai pas du tout l’intention d’utiliser ListView pour un nouveau développement car il est sur le point de le qualifier de 'hérité' pour le rendre obsolète.

5
Elletlar

ListView ne peut être utilisé que lorsque la liste n'est pas dynamique ou affectée par des événements réseau. Par exemple: navigation.

Pour tout autre usage, RecyclerView éclipse ListView. Puisque RecyclerView se soucie uniquement de recycler, il sera plus facile de faire des choses visuelles étroitement liées dans ListView, comme changer de position/réarrangement, animer l'ancien style de liste ou de grille mais il y a aussi ceci bibliothèque qui l'étend encore plus).

Aussi, si vous voulez utiliser CardView, je crois que c'est la seule façon de procéder (quelques bonne lecture quand utiliser une carte ou une liste).

3
inmyth

Une excellente alternative consiste à utiliser l'adaptateur de base. Il prend en charge le modèle d'utilisation Viewholder et le mien contient plus de 100 lignes avec des bitmaps et des boutons et fonctionne très bien.

1
grantespo