Ich bin gespannt auf den Zweck der Methoden getItem
und getItemId
auf die Klasse Adapter im Android SDK.
Aus der Beschreibung geht hervor, dass getItem
die zugrunde liegenden Daten zurückgegeben werden sollten. Wenn ich also eine Reihe von Namen habe ["cat","dog","red"]
und damit einen Adapter erstelle a
, a.getItem(1)
sollte dann "dog" zurückgegeben werden, richtig? Was soll a.getItemId(1)
zurückkehren?
Wenn Sie diese Methoden in der Praxis angewendet haben, können Sie ein Beispiel geben?
getItemId()
inArrayAdapter()
immer-1
mitassert false : "TODO"; return -1;
Antworten:
Ich sehe diese Methoden als einen saubereren Ansatz für den Zugriff auf die Daten meiner Liste. Anstatt über so etwas wie direkt auf mein Adapterobjekt zuzugreifen, kann ich den Adapter
myListData.get(position)
einfach so nennenadapter.get(position)
.Das gilt auch für
getItemId
. Normalerweise würde ich diese Methode verwenden, wenn ich eine Aufgabe basierend auf der eindeutigen ID eines Objekts in der Liste ausführen möchte. Dies ist besonders nützlich, wenn Sie mit einer Datenbank arbeiten. Die Rückgabeid
könnte ein Verweis auf ein Objekt in der Datenbank sein, an dem ich dann verschiedene Operationen ausführen könnte (Aktualisieren / Löschen / usw.).Anstatt also vom Rohdatenobjekt aus auf die ID zuzugreifen, wie
myListData.get(position).getId()
Sie es verwenden könnenadapter.getItemId(position)
.Ein Beispiel dafür, wo ich das Gefühl hatte, diese Methoden verwenden zu müssen, war ein Projekt mit dem SeparatedListViewAdapter . Dieser Adapter kann mehrere verschiedene Arten von Adaptern enthalten, die jeweils Daten eines anderen Typs darstellen (normalerweise). Beim Aufrufen
getItem(position)
vonSeparatedListViewAdapter
kann das zurückgegebene Objekt unterschiedlich sein, je nachdem, in welchem "Abschnitt" Sie es senden.Zum Beispiel, wenn Sie hatte zwei Abschnitte in der Liste (Obst und Süßigkeiten): Wenn Sie verwendet
getItem(position)
undposition
passiert auf ein Element in der sein Obst Abschnitt, würden Sie ein anderes Objekt erhalten , als wenn Sie aufgefordert ,getItem(position)
mitposition
Hinweis auf ein Element in der Süßigkeit Sektion. Sie können dann einen konstanten ID-Wert zurückgeben,getItemId(position)
der angibt, welche Art von DatengetItem(position)
zurückgegeben werden, oder verwendeninstanceof
, um zu bestimmen, über welches Objekt Sie verfügen.Abgesehen von dem, was ich erwähnt habe, hatte ich nie das Gefühl, dass ich diese Methoden wirklich anwenden musste
quelle
getView
,getCount
,getViewTypeCount
Ist, usw. speziell für richtig, um Ihr Listview - Benutzeroberfläche verwendet. Die anderen Funktionen helfen einfach dabei, andere Funktionen zu implementieren, z. B. das Ausführen weiterer Aktionen beim Klicken auf ein Element usw., obwohl ich häufiggetItem
InsidegetView
getItemId
, einfach zurückzugeben0L
odernull
es nirgendwo zu verwenden. Ich sehe keinen offensichtlichen Grund, warum eine UUID wertvoller wäre als nur einlong
Wert für die ID. Getrennter Modus? Was ist das?Nun, es scheint, dass diese Frage einfacher und unkomplizierter beantwortet werden könnte ... :-)
Einfach ausgedrückt, mit Android können Sie
long
jedemListView
Artikel einen anhängen , so einfach ist das. Wenn das System Sie über die Benutzerauswahl benachrichtigt, erhalten Sie drei identifizierende Variablen, die Ihnen mitteilen, was ausgewählt wurde:long
Sie an die einzelnen Elemente angehängt.Es liegt an Ihnen, zu entscheiden, welche dieser drei für Sie in Ihrem speziellen Fall am einfachsten zu handhaben ist, aber Sie haben immer alle drei zur Auswahl. Stellen Sie sich dies
long
als ein Tag vor, das automatisch an das Element angehängt wird, nur dass es noch einfacher und leichter auszulesen ist.Das Missverständnis darüber, was es normalerweise tut, beruht auf einer einfachen Konvention. Alle Adapter müssen eine
getItemId()
auch dann angeben, wenn sie diese dritte Identifikation nicht tatsächlich verwenden. Konventionell kehren diese Adapter (einschließlich vieler in Beispielen im SDK oder im gesamten Web) einfachposition
aus einem einzigen Grund zurück: Sie sind immer einzigartig. Wenn ein Adapter zurückkehrtposition
, bedeutet dies jedoch, dass er diese Funktion überhaupt nicht verwenden möchte, da diesposition
ohnehin bereits bekannt ist.Wenn Sie also einen anderen Wert zurückgeben müssen, den Sie für richtig halten, können Sie dies tun:
quelle
getItemId()
... Was passiert, wenn diese Methode in Ihrem benutzerdefinierten Adapter nicht überschrieben wird?Die
getItemId
Methode ist weitgehend für die Verwendung mit Cursorn ausgelegt, die von SQLite-Datenbanken unterstützt werden. Das ID-Feld des zugrunde liegenden Cursors für das Element an Position 1 wird zurückgegeben.In Ihrem Fall gibt es keine ID für das Element an Position 1: Ich gehe davon aus, dass die Implementierung von ArrayAdapter nur -1 oder 0 zurückgibt.
EDIT: Eigentlich gibt es nur die Position zurück: in diesem Fall
1
.quelle
-1
. Hier ist die Implementierungassert false : "TODO"; return -1;
Ich möchte erwähnen , dass nach der Umsetzung
getItem
undgetItemId
Sie verwenden können ListView.getItemAtPosition und ListView.getItemIdAtPosition direkt Sie auf Daten zugreifen, statt durch den Adapter gehen. Dies kann besonders nützlich sein, wenn Sie einen onClick-Listener implementieren.quelle
Wenn Sie
getItemId
richtig implementieren , kann es sehr nützlich sein.Beispiel:
Sie haben eine Liste von Alben:
Und Sie implementieren
getItemId
wie folgt:Jetzt hängt Ihre Element-ID von den Werten der Felder coverUrl und title ab. Wenn Sie diese ändern und
notifyDataSetChanged()
Ihren Adapter aufrufen, ruft der Adapter die Methode getItemId () jedes Elements auf und aktualisiert nur die Elemente, deren ID sich geändert hat.Dies ist sehr nützlich, wenn Sie einige "schwere" Operationen in Ihrem ausführen
getView()
.Übrigens: Wenn dies funktionieren soll, müssen Sie sicherstellen, dass Ihre
hasStableIds()
Methode false zurückgibt.quelle
hasStableIds()
false zurückgegeben werden? Es scheint mir, dass der aus derselben Zeichenfolge berechnete Hashcode jedes Mal denselben Wert zurückgeben würde, was laut den Dokumenten eine stabile ID ist .getItem
oder esgetItemId
gibt nur wenige Methoden, die hauptsächlich zum Anhängen von Daten an Elemente in der Liste entwickelt wurden. In diesem FallgetItem
können Sie jedes Objekt übergeben, das an das Element in der Liste angehängt wird. Normalerweise kehren die Leute zurücknull
.getItemId
ist ein eindeutigerlong
Wert, den Sie mit demselben Element in der Liste verknüpfen können. Personen geben im Allgemeinen die Position in der Liste zurück.Was ist der Nutzen. Da diese Werte an das Element in der Liste gebunden sind, können Sie sie extrahieren, wenn der Benutzer auf das Element klickt. Auf diese Werte kann über
AdapterView
Methoden zugegriffen werden.quelle