Quelqu'un peut-il en termes clairs m'expliquer l'utilisation getViewTypeCount()
et les getItemViewType()
méthodes de ArrayAdapter
?
Celles-ci gèrent le cas où vous souhaitez différents types de vue pour différentes lignes. Par exemple, dans une application de contacts, vous pouvez souhaiter que les lignes paires aient des images sur le côté gauche et les lignes impaires sur la droite. Dans ce cas, vous utiliseriez:
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position % 2;
}
Le framework utilise votre type de vue pour décider des vues àconvertView
getView
utiliser dans votre méthode . En d'autres termes, dans l'exemple ci-dessus, vos lignes paires recevront uniquement des vues recyclées avec des images sur le côté gauche à réutiliser, et les lignes impaires n'en recevront que celles avec des images sur la droite.
Si chaque ligne de votre liste a la même disposition, vous n'avez pas à vous soucier des types de vues. En fait, BaseAdapter.java fournit un comportement par défaut pour tous les adaptateurs:
public int getItemViewType(int position) {
return 0;
}
public int getViewTypeCount() {
return 1;
}
Cela vous fournit en effet le même type de vue pour chaque ligne.
Modifier - pour décrire le flux général:
AdapterView
aide d'un adaptateur.AdapterView
tente d'afficher les éléments visibles par l'utilisateur.getItemViewType
row n
, la ligne qu'il est sur le point d'afficher.n
type de ligne. Il n'en trouve pas car aucune vue n'a encore été recyclée.getView
est appelé pour la ligne n
.getItemViewType
une ligne n
pour déterminer le type de vue à utiliser.getView
et la vue de votre ligne est affichée à l'utilisateur.Désormais, lorsqu'une vue est recyclée en faisant défiler l'écran, elle entre dans un pool de vues recyclées qui est géré par le framework. Celles-ci sont essentiellement organisées par type de vue afin qu'une vue du type correct vous soit donnée en convertView
paramètre dans votre getView
méthode:
getItemViewType
la ligne qu'il souhaite afficher.convertView
paramètre de votre getView
méthode.
Si nous avons besoin d'afficher un type de vue différent dans la vue de liste, il est bon à utiliser
getViewTypeCount()
etgetItemViewType()
dans l'adaptateur au lieu de basculer une vueView.GONE
etView.VISIBLE
peut être une tâche très coûteuse à l'intérieurgetView()
qui affectera le défilement de la liste.Veuillez vérifier celui-ci pour l'utilisation de
getViewTypeCount()
etgetItemViewType()
dans Adapter.Lien: l'utilisation-de-getviewtypecount
la source
Regardez Outttt !!!!
J'ai dû faire face à un problème d'implémentation d'un
ListView
hier et ce sont deux types de vues pour les lignes qui se sont mélangées juste après que je les fasse défiler. Même si la réponse la plus votée dans ce fil donne une bonne explication générale, elle n'a pas mis en évidence l'information la plus importante pour arrêter le bogue de l'interface utilisateur ci-dessus que j'ai mentionné.Voici mon explication: les
deux
getViewTypeCount()
etgetItemViewType()
sont utilisés parBaseAdapter
lagetView
méthode de pour savoir quel type de vue doit être récupérée, recyclée et retournée. (comme expliqué dans la première réponse du fil de discussion). Mais si vous n'implémentez pas ces deux méthodes de manière intuitive selon le document d'API Android, vous risquez de vous retrouver dans le problème dont j'ai parlé.Ligne directrice résumée pour l'implémentation:
Pour implémenter plusieurs types de lignes de
Views
forListView
, nous devons essentiellement implémenter,getItemViewType()
et desgetViewTypeCount()
méthodes. Et lagetItemViewType()
documentation nous donne une note comme suit:Donc, dans votre,
getItemViewType()
vous devez renvoyer des valeurs pour le type de vue, en commençant par 0, jusqu'au dernier type comme (nombre de types - 1). Par exemple, disons que vous n'avez que trois types de vues? Ainsi, selon l'objet de données de la vue, vous ne pouvez renvoyer que 0 ou 1 ou 2 à partir de lagetItemViewType()
méthode, comme un index de tableau de base zéro. Et comme vous avez trois types de vues utilisées, votregetViewTypeCount()
méthode doit renvoyer 3.Dans tous les cas, si vous renvoyez d'autres valeurs entières telles que 1, 2, 3 ou 111, 222, 333 pour cette méthode, vous risquez certainement de rencontrer le bogue d'interface utilisateur ci-dessus que vous venez de placer en n'obéissant pas au document d'API Android.
Si vous ne comprenez pas ou ne pouvez toujours pas résoudre et avez besoin de plus d'informations, veuillez lire ma réponse détaillée dans ce fil de questions StackOverflow .
Lisez le document du développeur Android pour plus d'informations, vous pourriez trouver l'indice directement.
J'espère que cette réponse pourrait être utile à quelqu'un là-bas pour gagner beaucoup d'heures !!!
À votre santé!!!
la source
IGNORE_ITEM_VIEW_TYPE
que j'avais un bug sur l'un de mes ListView. J'ai utilisé un ArrayAdapter pour insérer une vue composée de 1 image et 2 vues de texte. Je n'avais qu'un seul type de vue. J'ai essayé soit de ne pas remplacer la méthode getItemViewType, soit de la remplacer en renvoyant la position ou un entier codé en dur. Dans tous les cas, je rencontrais des doublons dans ma liste, avec un comportement étrange lors du défilement (changements de doublons). Le retourIGNORE_ITEM_VIEW_TYPE
de la méthode a résolu le problème. Merci.