Antworten:
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 convertViewin Ihrer getViewMethode ü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:
AdapterViewmit einem Adapter an Ihren .AdapterViewversucht, Elemente anzuzeigen, die für den Benutzer sichtbar sind.getItemViewTypeZeile an n, die Zeile, die angezeigt werden soll.n. Es werden keine gefunden, da noch keine Ansichten recycelt wurden.getViewwird für Zeile aufgerufen n.getItemViewTypenach einer Zeile nauf, um zu bestimmen, welche Art von Ansicht Sie verwenden sollen.getViewund 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 convertViewParameter in Ihrer getViewMethode eine Ansicht des richtigen Typs erhalten :
getItemViewTypedie Zeile auf, die angezeigt werden soll.convertViewParameter für Ihre getViewMethode übergeben.Wenn wir verschiedene Arten von Ansicht in Listenansicht dann seine gut zu bedienen zeigen müssen getViewTypeCount()und getItemViewType()in Adapter statt einer Ansicht Makeln View.GONEund View.VISIBLEkann sehr teuer Aufgabe innerhalb getView()der die Liste blättern beeinflussen.
Bitte überprüfen Sie diese für die Verwendung von getViewTypeCount()und getItemViewType()im Adapter.
Watch Outttt !!!!
Ich hatte ListViewgestern 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()und getItemViewType()werden von BaseAdapterder getViewMethode 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 Viewsfor ListView-Zeilen zu implementieren, müssen im Wesentlichen Methoden getItemViewType()und getViewTypeCount()Methoden implementiert werden. Und die getItemViewType()Dokumentation gibt uns einen Hinweis wie folgt:
Hinweis: Ganzzahlen müssen im Bereich
0bis liegengetViewTypeCount() - 1.IGNORE_ITEM_VIEW_TYPEkann auch zurückgegeben werden.
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 der getItemViewType()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!!!
IGNORE_ITEM_VIEW_TYPEich 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ückgabe IGNORE_ITEM_VIEW_TYPEin der Methode hat das Problem behoben. Vielen Dank.