Kann mir jemand in einfachen Worten den Gebrauch getViewTypeCount()
und die getItemViewType()
Methoden von erklären ArrayAdapter
?
Diese behandeln den Fall, dass Sie unterschiedliche wollen Typen Sicht für verschiedene Zeilen. In einer Kontaktanwendung möchten Sie möglicherweise, dass gerade Zeilen Bilder auf der linken Seite und ungerade Zeilen Bilder auf der rechten Seite haben. In diesem Fall würden Sie verwenden:
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position % 2;
}
Das Framework verwendet Ihren Ansichtstyp, um zu entscheiden, über welche Ansichten Sie convertView
in Ihrer getView
Methode übergeben werden . Mit anderen Worten, im obigen Beispiel erhalten Ihre geraden Zeilen nur recycelte Ansichten mit Bildern auf der linken Seite, die wiederverwendet werden können, und ungerade Zeilen erhalten nur solche mit Bildern auf der rechten Seite.
Wenn jede Zeile in Ihrer Liste das gleiche Layout hat, müssen Sie sich keine Gedanken über die Ansichtstypen machen. Tatsächlich bietet BaseAdapter.java ein Standardverhalten für alle Adapter:
public int getItemViewType(int position) {
return 0;
}
public int getViewTypeCount() {
return 1;
}
Auf diese Weise erhalten Sie für jede Zeile den gleichen Ansichtstyp.
Bearbeiten - um den allgemeinen Ablauf zu skizzieren:
AdapterView
mit einem Adapter an Ihren .AdapterView
versucht, Elemente anzuzeigen, die für den Benutzer sichtbar sind.getItemViewType
Zeile an n
, die Zeile, die angezeigt werden soll.n
. Es werden keine gefunden, da noch keine Ansichten recycelt wurden.getView
wird für Zeile aufgerufen n
.getItemViewType
nach einer Zeile n
auf, um zu bestimmen, welche Art von Ansicht Sie verwenden sollen.getView
und die Ansicht Ihrer Zeile wird dem Benutzer angezeigt.Wenn eine Ansicht durch Scrollen vom Bildschirm wiederhergestellt wird, wird sie in einen Pool für wiederverwertete Ansichten verschoben, der vom Framework verwaltet wird. Diese sind im Wesentlichen nach Ansichtstyp organisiert, sodass Sie in convertView
Parameter in Ihrer getView
Methode eine Ansicht des richtigen Typs erhalten :
getItemViewType
die Zeile auf, die angezeigt werden soll.convertView
Parameter für Ihre getView
Methode übergeben.
Wenn wir verschiedene Arten von Ansicht in Listenansicht dann seine gut zu bedienen zeigen müssen
getViewTypeCount()
undgetItemViewType()
in Adapter statt einer Ansicht MakelnView.GONE
undView.VISIBLE
kann sehr teuer Aufgabe innerhalbgetView()
der die Liste blättern beeinflussen.Bitte überprüfen Sie diese für die Verwendung von
getViewTypeCount()
undgetItemViewType()
im Adapter.Link: die Verwendung von getviewtypecount
quelle
Watch Outttt !!!!
Ich hatte
ListView
gestern ein Problem mit der Implementierung eines und es gab zwei Arten von Ansichten für Zeilen, die kurz nach dem Scrollen durcheinander gebracht wurden. Obwohl die am häufigsten gewählte Antwort in diesem Thread eine gute allgemeine Erklärung enthält, hat sie nicht die wichtigsten Informationen hervorgehoben, um den oben erwähnten UI-Fehler zu stoppen.Hier ist meine Erklärung:
Beide
getViewTypeCount()
undgetItemViewType()
werden vonBaseAdapter
dergetView
Methode verwendet, um herauszufinden, welcher Typ einer Ansicht abgerufen, recycelt und zurückgegeben werden soll. (wie in der oberen Antwort im Thread erklärt). Wenn Sie diese beiden Methoden jedoch nicht intuitiv gemäß dem Android API Doc implementieren, können Sie auf das von mir erwähnte Problem stoßen.Zusammenfassende Richtlinie für die Implementierung:
Um mehrere Arten von
Views
forListView
-Zeilen zu implementieren, müssen im Wesentlichen MethodengetItemViewType()
undgetViewTypeCount()
Methoden implementiert werden. Und diegetItemViewType()
Dokumentation gibt uns einen Hinweis wie folgt:Daher
getItemViewType()
sollten Sie in Ihrem Wert Werte für den Ansichtstyp von 0 bis zum letzten Typ als (Anzahl der Typen - 1) zurückgeben. Nehmen wir zum Beispiel an, Sie haben nur drei Arten von Ansichten. Abhängig vom Datenobjekt für die Ansicht können Sie also nur 0 oder 1 oder 2 von dergetItemViewType()
Methode zurückgeben, wie bei einem nullbasierten Array-Index. Da drei Arten von Ansichten verwendet werden,getViewTypeCount()
muss Ihre Methode 3 zurückgeben.Wenn Sie für diese Methode andere ganzzahlige Werte wie 1, 2, 3 oder 111, 222, 333 zurückgeben, kann auf jeden Fall der oben genannte UI-Fehler auftreten, den Sie gerade platziert haben, indem Sie sich nicht an das Android-API-Dokument halten.
Wenn Sie den Hinweis nicht erhalten haben oder sich noch nicht auflösen konnten und weitere Informationen benötigen, lesen Sie bitte meine ausführliche Antwort in diesem StackOverflow-Q & A-Thread .
Lesen Sie das Android Developer Doc, um weitere Informationen zu erhalten. Möglicherweise finden Sie den Hinweis direkt.
Hoffe, diese Antwort könnte für jemanden da draußen hilfreich sein, um viele Stunden zu sparen !!!
Prost!!!
quelle
IGNORE_ITEM_VIEW_TYPE
ich einen Fehler in einer meiner ListView hatte. Ich habe einen ArrayAdapter verwendet, um eine Ansicht einzufügen, die aus 1 Bild- und 2 Textansichten besteht. Ich hatte nur einen Ansichtstyp. Ich habe versucht, die Methode getItemViewType entweder nicht zu überschreiben oder sie zu überschreiben, indem ich die Position oder eine fest codierte Ganzzahl zurückgebe. In allen Fällen traten in meiner Liste Duplikate mit merkwürdigem Verhalten beim Scrollen auf (Änderungen an Duplikaten). Die RückgabeIGNORE_ITEM_VIEW_TYPE
in der Methode hat das Problem behoben. Vielen Dank.