Devrions-nous utiliser RecyclerView pour remplacer ListView?

232

Les documents Android disent:

Le widget RecyclerView est une version plus avancée et flexible de ListView. Ce widget est un conteneur pour afficher de grands ensembles de données qui peuvent être défilés très efficacement 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 du réseau

En fait, ListViewpeut faire tout ce qui précède si l'efficacité n'a pas d'importance, et nous avons trouvé de nombreux problèmes lorsque nous utilisons RecyclerViewpour remplacer ListView:

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

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

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

  4. Aucun addHeaderView pour l'en-tête de liste - solution

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

Donc, lorsque nous utilisons RecyclerViewpour remplacer ListView, nous devons faire beaucoup de codage supplémentaire pour atteindre le même effet que ListView.

QUESTION:

  • Est - il utile que nous remplaçons ListViewavec RecyclerViewtout à fait?
  • sinon, dans quel cas devrions-nous plutôt utiliser à la RecyclerViewplace ListView, et vice versa?
Xcihnegn
la source
9
votre fil n'est que le premier numéro, et ce n'est pas ma question
Xcihnegn
3
Mentionnez simplement que vous devez utiliser une vue d'ensemble du recyclage si vous souhaitez utiliser une barre d'actions réduite. medium.com/android-bites/…
francas
vous devez utiliser recyclerview car il offre plus de contrôle que listview. C'est un peu complexe mais vous y arrivez alors votre vie sera super facile chaque fois que vous aurez affaire à une liste de choses.
Sadashiv
3
mieux est l'ennemi du bien.
agesgod

Réponses:

118

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.

RecyclerView est puissant lorsque vous devez personnaliser votre liste ou que vous souhaitez de meilleures animations. Ces méthodes pratiques dans ListView ont causé beaucoup de problèmes aux gens, c'est pourquoi RecyclerView leur fournit une solution plus flexible.

Le changement majeur que vous devez effectuer pour la migration se trouve dans votre adaptateur. Si vous souhaitez continuer à appeler notifyDataSetChanged, vous perdez la plupart des avantages d'animation et de liaison. Mais si vous pouvez changer votre adaptateur pour envoyer des événements de notification détaillés (ajoutés / supprimés / déplacés / mis à jour), vous obtenez de bien meilleures animations et performances. Ces événements permettent à RecyclerView de choisir les animations correctes et permettent également d'éviter les onBindappels inutiles . Vous obtiendrez un énorme avantage si les vues de vos articles sont complexes. De plus, à l'avenir, il y aura plus de composants autour de RecyclerView.

yigit
la source
2
Si je pouvais vous donner 100 votes positifs, je le ferais. La notifyDataSetChanged()méthode m'obligeait RecyclerViewà continuer à demander de nouveaux produits ViewHolderstout le temps, à vider les avantages du ViewHoldermodèle. À la recherche de la solution, j'ai trouvé votre commentaire qui répond à mon problème en passant: D merci!
Aspiring Dev
Je ne suis pas d'accord "Vous obtiendrez un énorme avantage si les vues de vos articles sont complexes", j'ai recyclerView dans lequel l'adaptateur en a 3 sinon, Recyclerview fonctionne mal dans mon cas. J'ai dû désactiver le recyclage à l'aide isRecyclable(false);et le résultat final est très décalé RecyclerView. Je ne peux même pas changer cela, il faudra beaucoup de temps pour revenir à la liste :(
kashyap jimuliya
4
les gens utilisent des véhicules récréatifs avec de nombreux autres types sans problème et avec de bonnes performances. Il y a autre chose de mal dans votre code. Vous devez utiliser systrace / traceview et voir ce qui se passe.
yigit
1
@kashyapjimuliya comme yigit l'a mentionné, 3 si-autre ne devrait pas provoquer cela. Premièrement, vous n'avez pas mentionné où vous avez mis ces if-else; deuxièmement, la désactivation du recyclage devrait ralentir et non accélérer. Pourquoi? Parce que gonfler une vue et faire findViewById()coûte beaucoup plus cher que de faire le ViewHolderchemin.
Sufian
24

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

Le RecyclerView donne un pouvoir énorme à ses développeurs au prix d'augmenter la complexité pour les développeurs. Il y a certaines choses qui pourraient être faites facilement dans un ListView peuvent maintenant prendre beaucoup d'efforts inutiles.

Mais oui, il y a beaucoup de choses qu'un ListView ne peut jamais faire, comme l'incroyable fonctionnalité LayoutManager qui peut vous permettre de changer dynamiquement la mise en page en horizontal, vertical, grille ou grille décalée de manière transparente.

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

Aritra Roy
la source
3
Bien sûr, RecyclerView augmente la complexité, mais au moins il implémente correctement le modèle ViewHolder pour vous.
IgorGanapolsky
@IgorGanapolsky +1 pour l'implémentation du modèle ViewHolder.
Sreekanth Karumanaghat
vous pouvez écrire votre propre modèle de support de vue très bien avec un ListView
dan
9

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 avec une largeur de match_parent et 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.

Phantômaxx
la source
19
Ce ne sont pas mes questions, j'ai eu un lien pour chaque solution de problème
Xcihnegn
6

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 basé cette décision sur des «facteurs humains», selon lesquels la création d'un ListView simple avec moins de code est meilleure si les performances sont immatérielles. Je pense souvent à un professeur d'université qui aimait à dire: "Mon professeur le grand Niclaus Wirth, l'inventeur de Pascal, disait que si un programme a plus de 50 lignes de code, c'est certainement faux ..."

Mais ce qui m'a convaincu d'arrêter d'utiliser ListView, c'est qu'il a récemment été déplacé dans la catégorie "Legacy" dans l'outil de conception Android Studio avec RelativeLayout.

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

Je pense que c'est une forme «douce» de «dépréciation». Il serait trop perturbateur s'il était en fait obsolète et que tous les développeurs consciencieux déplaçaient leur code vers RecyclerView.

En outre, l'introduction de ListView avertit tout en 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

En outre, le guide de ListView parle toujours de chargeurs de curseur, mais getSupportCursorLoader () lui-même vient d'être déconseillé dans l'API 28.
https://developer.android.com/guide/topics/ui/layout/listview

Améliorations récentes d'Android Studio:

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

Cela nous donne un RecylerView entièrement fonctionnel rempli de texte de base. Cela supprime ma dernière vraie raison d'utiliser ListView car il est maintenant tout aussi facile de configurer un RecylerView de base.

En résumé, je n'ai pas du tout l'intention d'utiliser ListView pour de nouveaux développements, car l'étiqueter comme «hérité» est à un pas de la déprécier.

Elletlar
la source
3

Le seul cas où il est encore possible d'utiliser ListView est lorsque la liste n'est pas dynamique ou affectée par des événements réseau. Par exemple: navigation.

Pour toute autre utilisation, RecyclerView éclipse ListView. Étant donné que RecyclerView ne se soucie que du recyclage, il sera plus facile de faire des choses visuelles étroitement couplées dans ListView, comme changer la position / le réarrangement, l'animation (en fait, il vient avec RecyclerView.ItemAnimator), des dispositions personnalisées (le stock a StaggeredGrid en plus de l'ancien style de liste ou de grille mais il y a aussi cette bibliothèque qui l'étend encore plus).

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

inmyth
la source
Faites-vous référence à la saisie d'une liste de données sur les serveurs, puis stockées dans le sqlite sur le téléphone pour être utilisées dans un affichage de liste (disons vos abonnés), il est préférable d'utiliser une vue de recyclage qu'une vue de liste avec un support de vue ?
Lion789
Oui. Mais pour être précis, je ne vois plus de rôle pour ListView, sauf la navigation et c'est parce que je pense que c'est exagéré d'utiliser RecyclerView là-bas.
inmyth
2

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

grantespo
la source