J'essaie de travailler avec le nouveau RecyclerView
, mais je n'ai pas pu trouver d'exemple RecyclerView
avec différents types de lignes / vues de cartes gonflées.
Avec ListView
je remplace le getViewTypeCount
et getItemViewType
, pour gérer différents types de lignes.
Suis-je censé le faire comme "à l'ancienne" ou devrais-je faire quelque chose avec LayoutManager
? Je me demandais si quelqu'un pouvait m'indiquer la bonne direction. Parce que je ne peux trouver que des exemples avec un seul type.
Je veux avoir une liste de cartes légèrement différentes. Ou devrais-je simplement utiliser un scrollView
avec à l' cardViews
intérieur de celui-ci ... le faire sans l'adaptateur et recyclerView
?
Réponses:
La gestion de la logique des lignes / sections similaire à UITableView d'iOS n'est pas aussi simple dans Android que dans iOS, cependant, lorsque vous utilisez RecyclerView, la flexibilité de ce que vous pouvez faire est bien plus grande.
En fin de compte, tout dépend de la façon dont vous déterminez le type de vue que vous affichez dans l'adaptateur. Une fois que vous avez compris cela, la navigation devrait être facile (pas vraiment, mais au moins vous l'aurez triée).
L'adaptateur expose deux méthodes que vous devez remplacer:
L'implémentation par défaut de cette méthode retournera toujours 0, indiquant qu'il n'y a qu'un seul type de vue. Dans votre cas, ce n'est pas le cas, et vous devrez donc trouver un moyen d'affirmer quelle ligne correspond à quel type de vue. Contrairement à iOS, qui gère cela pour vous avec des lignes et des sections, vous n'aurez ici qu'un seul index sur lequel vous appuyer, et vous devrez utiliser vos compétences de développeur pour savoir quand une position est en corrélation avec un en-tête de section, et quand elle correspond à une ligne normale.
Vous devez quand même remplacer cette méthode, mais généralement, les gens ignorent simplement le paramètre viewType. En fonction du type de vue, vous devrez gonfler la bonne ressource de mise en page et créer votre support de vue en conséquence. Le RecyclerView gérera le recyclage de différents types de vues de manière à éviter les conflits entre différents types de vues.
Si vous prévoyez d'utiliser un LayoutManager par défaut, tel que
LinearLayoutManager
, vous devriez être prêt à partir. Si vous envisagez de créer votre propre implémentation de LayoutManager, vous devrez travailler un peu plus dur. La seule API avec laquelle vous devez vraiment travailler est cellefindViewByPosition(int position)
qui donne une vue donnée à une certaine position. Étant donné que vous voudrez probablement le présenter différemment en fonction du type de cette vue, vous avez quelques options:Généralement, lorsque vous utilisez le modèle ViewHolder, vous définissez la balise de la vue avec le support de vue. Vous pouvez l'utiliser pendant l'exécution dans le gestionnaire de mise en page pour savoir de quel type est la vue en ajoutant un champ dans le support de vue qui l'exprime.
Puisque vous aurez besoin d'une fonction qui détermine quelle position correspond à quel type de vue, vous pouvez aussi bien rendre cette méthode globalement accessible d'une manière ou d'une autre (peut-être une classe singleton qui gère les données?), Et ensuite vous pouvez simplement interroger la même méthode en fonction de la position.
Voici un exemple de code:
Voici un exemple de l'apparence de ces détenteurs de vue:
Bien sûr, cet exemple suppose que vous avez construit votre source de données (myData) d'une manière qui facilite l'implémentation d'un adaptateur de cette manière. À titre d'exemple, je vais vous montrer comment je construirais une source de données qui montre une liste de noms et un en-tête pour chaque fois que la 1ère lettre du nom change (en supposant que la liste est alphabétisée) - similaire à la façon dont un contacts la liste ressemblerait à:
Cet exemple vient résoudre un problème assez spécifique, mais j'espère que cela vous donne un bon aperçu de la façon de gérer différents types de lignes dans un recycleur et vous permet de faire les adaptations nécessaires dans votre propre code pour répondre à vos besoins.
la source
names[i].substring(0, 1)
onCreateViewHolder
qui nous aidera à créer un support de vue. Pour plus de détails, vous pouvez consulter ma part: stackoverflow.com/questions/47245398/…L'astuce consiste à créer des sous-classes de ViewHolder, puis à les convertir.
Et puis, au moment de l'exécution, faites quelque chose comme ceci:
J'espère que ça aide.
la source
Selon Gil, une excellente réponse que j'ai résolue en remplaçant le getItemViewType comme expliqué par Gil. Sa réponse est excellente et doit être marquée comme correcte. Dans tous les cas, j'ajoute le code pour atteindre le score:
Dans votre adaptateur recycleur:
En faisant cela, vous pouvez définir n'importe quelle disposition personnalisée pour n'importe quelle ligne!
la source
C'est assez délicat mais trop difficile, copiez simplement le code ci-dessous et vous avez terminé
prendre plaisir !!!!
la source
Nous pouvons obtenir plusieurs vues sur un seul RecyclerView de la manière ci-dessous: -
Dépendances sur Gradle alors ajoutez le code ci-dessous: -
RecyclerView en XML
Code d'activité
Premier XML
Deuxième XML
Troisième XML
Il est maintenant temps de créer un adaptateur et c'est principal pour afficher une vue -2 différente sur la même vue du recycleur.Veuillez donc vérifier complètement ce code: -
Vous pouvez également consulter ce lien pour plus d'informations.
la source
Vous devez implémenter la
getItemViewType()
méthode dansRecyclerView.Adapter
. Par défaut, l'onCreateViewHolder(ViewGroup parent, int viewType)
implémentationviewType
de cette méthode retourne0
. Tout d'abord, vous avez besoin du type de vue de l'élément à la position à des fins de recyclage de la vue et pour cela, vous devez remplacer lagetItemViewType()
méthode dans laquelle vous pouvez transmettreviewType
qui renverra votre position d'élément. Un exemple de code est donné ci-dessousla source
getItemViewType (position int) est la clé
Comment faire ?
Vous pouvez créer un
RecyclerView
avec n'importe quel nombre de vues différentes (ViewHolders). Mais pour une meilleure lisibilité, prenons un exemple deRecyclerView
avec deuxViewholders
.N'oubliez pas ces 3 étapes simples et vous serez prêt à partir.
getItemViewType(int position)
ViewType
méthode in onCreateViewHolder ()Remplir la vue en fonction de la
onBindViewHolder()
méthode itemViewType inVoici un extrait de code pour vous
Code GitHub:
Voici un projet où j'ai implémenté un RecyclerView avec plusieurs ViewHolders.
la source
Vous pouvez simplement renvoyer ItemViewType et l'utiliser. Voir le code ci-dessous:
la source
Vous pouvez utiliser la bibliothèque: https://github.com/vivchar/RendererRecyclerViewAdapter
Pour chaque élément, vous devez implémenter un ViewRenderer, ViewHolder, SomeModel:
ViewHolder - c'est un simple support de vue de vue de recycleur.
SomeModel - c'est votre modèle avec
ItemModel
interfacePour plus de détails, vous pouvez consulter les documentations.
la source
Vous pouvez utiliser cette bibliothèque:
https://github.com/kmfish/MultiTypeListViewAdapter (écrit par moi)
Adaptateur de configuration:
Pour chaque élément de campagne:
la source