Je suis curieux de connaître le but des méthodes getItem
et getItemId
de la classe Adapter dans le SDK Android.
D'après la description, il semble que getItem
devrait renvoyer les données sous-jacentes. Donc, si j'ai un tableau de noms ["cat","dog","red"]
et que je crée un adaptateur à l' a
aide de cela, alors a.getItem(1)
devrait retourner "chien", correct? Que devrait a.getItemId(1)
revenir?
Si vous avez utilisé ces méthodes dans la pratique, pourriez-vous donner un exemple?
getItemId()
dansArrayAdapter()
revient toujours-1
avecassert false : "TODO"; return -1;
Réponses:
Je vois ces méthodes comme une approche plus propre pour accéder aux données de ma liste. Au lieu d'accéder directement à mon objet adaptateur via quelque chose comme
myListData.get(position)
je peux simplement appeler l'adaptateur commeadapter.get(position)
.Il en va de même
getItemId
. Habituellement, j'utiliserais cette méthode lorsque je souhaite exécuter une tâche en fonction de l'ID unique d'un objet dans la liste. Ceci est particulièrement utile lorsque vous travaillez avec une base de données. Le retournéid
pourrait être une référence à un objet de la base de données sur lequel je pourrais alors effectuer différentes opérations (mise à jour / suppression / etc).Donc, au lieu d'accéder à l'ID à partir de l'objet de données brutes comme
myListData.get(position).getId()
vous pouvez l'utiliseradapter.getItemId(position)
.Un exemple où j'ai senti que j'avais besoin d'utiliser ces méthodes était dans un projet utilisant le SeparatedListViewAdapter . Cet adaptateur peut contenir plusieurs types différents d'adaptateurs, chacun représentant des données d'un type différent (généralement). Lors de l'appel
getItem(position)
sur leSeparatedListViewAdapter
, l'objet retourné peut être différent selon la "section" dans laquelle vous l'envoyez.Par exemple, si vous aviez 2 sections dans votre liste (fruits et bonbons): Si vous avez utilisé
getItem(position)
et que vous vous trouviezposition
sur un article dans la section des fruits , vous recevriez un objet différent de celui que vous aviez demandégetItem(position)
enposition
pointant un article dans le bonbon section. Vous pouvez ensuite renvoyer une sorte de valeur d'ID constante dansgetItemId(position)
laquelle représente le type de donnéesgetItem(position)
renvoyées, ou utiliserinstanceof
pour déterminer quel objet vous avez.À part ce que j'ai mentionné, je n'ai jamais senti que j'avais vraiment besoin d'utiliser ces méthodes
la source
getView
,getCount
,getViewTypeCount
, Etc sont utilisés spécifiquement pour montrer correctement votre interface utilisateur listview. les autres fonctions aident simplement à créer implémenter d'autres fonctionnalités telles que l'exécution d'actions supplémentaires en cliquant sur un élément, etc. bien que j'utilise souvent à l'getItem
intérieurgetView
getItemId
, de simplement retourner0L
ou denull
ne pas l'utiliser n'importe où. Je ne vois aucune raison évidente pour laquelle un UUID serait plus précieux qu'une simplelong
valeur pour l'ID. Mode déconnecté? Qu'est-ce que c'est?Eh bien, il semble que cette question pourrait trouver une réponse plus simple et plus directe ... :-)
En termes simples, Android vous permet de joindre un
long
à n'importe quelListView
élément, c'est aussi simple que cela. Lorsque le système vous informe de la sélection de l'utilisateur, vous recevez trois variables d'identification pour vous indiquer ce qui a été sélectionné:long
vous avez joint aux éléments individuels.C'est à vous de décider lequel de ces trois est le plus facile à gérer dans votre cas particulier, mais vous avez le choix entre les trois à tout moment. Considérez cela
long
comme une étiquette automatiquement attachée à l'élément, mais c'est encore plus simple et plus facile à lire.Le malentendu sur ce qu'il fait habituellement découle d'une simple convention. Tous les adaptateurs doivent fournir un
getItemId()
même s'ils n'utilisent pas réellement cette troisième identification. Ainsi, par convention, ces adaptateurs (y compris de nombreux exemples dans le SDK ou partout sur le Web) reviennent simplementposition
pour une seule raison: c'est toujours unique. Pourtant, si un adaptateur revientposition
, cela signifie vraiment qu'il ne veut pas du tout utiliser cette fonctionnalité, car elleposition
est déjà connue, de toute façon.Donc, si vous devez renvoyer une autre valeur que vous jugez appropriée, n'hésitez pas à le faire:
la source
getItemId()
... Que se passe-t-il quand / si cette méthode n'est pas remplacée dans votre adaptateur personnalisé?La
getItemId
méthode est en grande partie conçue pour fonctionner avec des curseurs qui sont sauvegardés par des bases de données SQLite. Il renverra le champ id du curseur sous-jacent pour l'élément en position 1.Dans votre cas, il n'y a pas d'identifiant pour l'élément en position 1: je suppose que l'implémentation d'ArrayAdapter renvoie simplement -1 ou 0.
EDIT: en fait, il renvoie simplement la position: dans ce cas
1
.la source
-1
. Voici l'implémentationassert false : "TODO"; return -1;
Je tiens à mentionner qu'après la mise en œuvre
getItem
,getItemId
vous pouvez utiliser ListView.getItemAtPosition et ListView.getItemIdAtPosition pour accéder directement à vos données, au lieu de passer par l'adaptateur. Cela peut être particulièrement utile lors de l'implémentation d'un écouteur onClick.la source
Si vous implémentez
getItemId
correctement, cela peut être très utile.Exemple :
Vous avez une liste d'albums:
Et vous implémentez
getItemId
comme ceci:Maintenant, votre identifiant d'élément dépend des valeurs des champs coverUrl et title et si vous changez alors et appelez
notifyDataSetChanged()
votre adaptateur, alors l'adaptateur appellera la méthode getItemId () de chaque élément et mettra à jour uniquement les éléments dont l'ID a changé.Ceci est très utile si vous effectuez des opérations "lourdes" dans votre fichier
getView()
.BTW: si vous voulez que cela fonctionne, vous devez vous assurer que votre
hasStableIds()
méthode renvoie false;la source
hasStableIds()
retourner faux? Il me semble que le hashcode calculé à partir de la même chaîne renverrait la même valeur à chaque fois, ce qui est un ID stable selon la documentation .getItem
ougetItemId
sont quelques méthodes principalement conçues pour joindre des données avec des éléments dans la liste. Dans le cas degetItem
, vous pouvez transmettre tout objet qui s'attachera à l'élément dans la liste. Normalement, les gens reviennentnull
.getItemId
est toutelong
valeur unique que vous pouvez attacher avec le même élément dans la liste. Les gens retournent généralement la position dans la liste.Quel en est l'usage. Eh bien, comme ces valeurs sont liées à l'élément dans la liste, vous pouvez les extraire lorsque l'utilisateur clique sur l'élément. Ces valeurs sont accessibles par des
AdapterView
méthodes.la source