Devrions-nous utiliser RecyclerView pour remplacer ListView?

Android Docs say:

le widget RecyclerView est une version plus évoluée et flexible de ListView. Ce widget est un conteneur pour afficher de grands ensembles de données qui peut être déroulé très efficacement en maintenant un nombre limité de point de vue. Utilisez le widget RecyclerView lorsque vous avez des collectes de données dont les éléments changent au moment de l'exécution en fonction des actions de l'utilisateur réseau Evénements

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 :

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

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

  3. non incorporé sélecteur de chevauchement, il n'y a aucune rétroaction visuelle lorsque vous cliquez sur la liste item - solution

  4. Non addHeaderView pour la liste tête de solution

peut-être d'autres problèmes ...

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

QUESTION:

  • vaut-il la peine de remplacer ListView par RecyclerView totalement ?
  • si ce n'est pas le cas , dans quel cas devrions-nous plutôt utiliser RecyclerView au lieu de ListView , et vice versa ?
212
demandé sur ROMANIA_engineer 2015-02-08 12:43:14

6 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 quand vous avez besoin de personnaliser votre liste ou vous voulez 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 faire pour la migration est dans votre adaptateur. Si vous voulez continuer à appeler notifyDataSetChanged , vous perdez la plupart des avantages de l'animation et de la reliure. Mais si vous pouvez changer votre adaptateur pour envoyer des évènements de notification détaillés (ajouté/supprimé/déplacé/mis à jour), alors vous obtenez de bien meilleures animations et performances. Ces événements permettent à RecyclerView de choisir des animations correctes et cela l'aide également à éviter les appels inutiles onBind . Vous obtiendrez un avantage énorme si vos vues d'article sont complexes. De plus, à l'avenir, il y aura plus de composantes autour RecyclerView.

115
répondu yigit 2015-02-08 19:40:54

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 le remplacer par un RecyclerView.

le RecyclerView donne une puissance é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 peut maintenant prendre beaucoup d'effort inutile.

Mais oui, il y a beaucoup de choses qu'un ListView peut ne jamais faire, comme l'étonnant LayoutManager fonctionnalité qui peut vous permettre de changer dynamiquement la disposition horizontale, verticale, grille, ou décalé grille de façon transparente.

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

21
répondu Aritra Roy 2017-05-23 11:47:21

1 vous pouvez utiliser une interface pour fournir un écouteur de clic. J'utilise cette technique avec des ListViews, aussi.

2 pas de diviseur: ajoutez simplement dans votre rangée une vue avec une largeur de match_parent et une hauteur de 1dp et donnez-lui une couleur de fond .

3 il suffit D'utiliser un sélecteur StateList pour la rangée fond.

4 addHeaderView peut être évité dans les ListViews, aussi: il suffit de mettre 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.

8
répondu Kling Klang 2015-02-08 10:34:21

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 eclipses ListView. Puisque RecyclerView ne se soucie que du recyclage, il sera plus facile de faire des choses visuelles connexes qui étaient étroitement liées dans ListView, comme changer de position / réarrangement, animation (en fait, il est livré avec RecyclerView.ItemAnimator), des dispositions sur mesure (le stock a StaggeredGrid en plus de la vieille liste ou le style de grille, mais il y a aussi cette bibliothèque qui l'étend encore plus).

aussi si vous voulez utiliser CardView je crois que c'est la seule façon d'y aller (quelque bonne lecture quand utiliser la carte ou la liste).

3
répondu inmyth 2015-04-08 19:33:02

une excellente alternative est d'utiliser le BaseAdapter. Il prend en charge l'utilisation de L'affichage et le mien contient plus de 100 lignes avec des bitmaps et des boutons et il fonctionne très lisse.

1
répondu grant 2017-01-24 22:20:25

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

j'ai basé cette décision sur les "facteurs humains", que la création d'un ListView simple avec moins de code est mieux si la performance est sans importance. Je pense souvent à un professeur d'université qui aimait à dire: "mon professeur le grand Niclaus Wirth, l'inventeur de Pascal, utilisé pour dire si un programme a plus de 50 lignes de code, il est sûr pour être mauvais..."

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 " dans L'outil de conception Android Studio avec RelativeLayout.

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

je pense que c'est 'mou' de 'retrait'. Ce serait trop perturbant s'il était effectivement déprécié et que tous les développeurs consciencieux déplaçaient leur code vers RecyclerView.

de plus, L'introduction à 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

de plus, le guide de ListView parle encore des chargeurs de curseur, mais getSupportCursorLoader() lui-même vient d'être déprécié dans L'API 28.

https://developer.android.com/guide/topics/ui/layout/listview

récentes améliorations à Android Studio:

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

cela nous donne un RecylerView entièrement fonctionnel peuplé de texte de base. Cela élimine ma dernière vraie raison d'utiliser ListView parce qu'il est maintenant tout comme facile à configurer un RecylerView de base.

en résumé, je n'ai pas l'intention du tout D'utiliser ListView pour un nouveau développement parce que l'étiquetage "héritage" est à un pas de l'déprécier.

0
répondu Elletlar 2018-07-25 17:43:24