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, ListView
peut 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 RecyclerView
pour remplacer ListView
:
Il n'y a pas onItemClickListener () pour la sélection des éléments de liste - solution
Pas de séparation entre les éléments de la liste - solution
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
Aucun addHeaderView pour l'en-tête de liste - solution
Peut-être plus de problèmes ...
Donc, lorsque nous utilisons RecyclerView
pour 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
ListView
avecRecyclerView
tout à fait?- sinon, dans quel cas devrions-nous plutôt utiliser à la
RecyclerView
placeListView
, et vice versa?
la source
Réponses:
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 lesonBind
appels 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.la source
notifyDataSetChanged()
méthode m'obligeaitRecyclerView
à continuer à demander de nouveaux produitsViewHolders
tout le temps, à vider les avantages duViewHolder
modèle. À la recherche de la solution, j'ai trouvé votre commentaire qui répond à mon problème en passant: D merci!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 :(findViewById()
coûte beaucoup plus cher que de faire leViewHolder
chemin.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 .
la source
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.
la source
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.
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:
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.
la source
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).
la source
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.
la source