21

Können Sie die getView() Methode eines ArrayAdapter erklären.Erklärung der getView() - Methode eines ArrayAdapter

las ich die Dokumentation und es hat drei Parameter:

  • position: Die Position des Elements innerhalb der das Element von eingestellten Daten des Adapters, dessen Ansicht wir wollen.
  • convertView: Die alte Ansicht wiederverwenden, wenn möglich. Hinweis: Sie sollten überprüfen, dass diese Ansicht vor der Verwendung nicht null und von einem geeigneten Typ ist. Wenn es nicht möglich ist, diese Ansicht zu konvertieren, um die korrekten Daten anzuzeigen, kann diese Methode eine neue Ansicht erstellen.
    Heterogene Listen können ihre Anzahl an Ansichtstypen angeben, so dass diese Ansicht immer vom richtigen Typ ist (siehe getViewTypeCount() und getItemViewType (int)).
  • parent: Die Eltern, die diese Ansicht wird schließlich zu

ich den position Parameter verstanden angebracht werden. Wie sie gesagt haben, impliziert dies die Position des Gegenstandes, dessen Ansicht angefordert wurde.

Woher kommt convertView? Ich habe viele Beispiele gesehen, wo sie prüfen, ob convertView null ist. Wenn is null ist, blähen sie eine neue Instanz des Zeilenlayouts auf, füllen sie auf und geben sie zurück. Ich nehme an, ich habe mich auch darum gekümmert, aber eine Sache verblüfft mich immer noch. Was ist das Layout, das über den Parameter convertView übergeben wird? Ist das the resource parameter that is passed in when initialising the ArrayAdapter? Ist eine zwischengespeicherte Kopie des letzten Layouts, das von getView() zurückgegeben wird?

Und zuletzt. Was macht der Parameter parent? Ich habe nicht viele Beispiele gesehen, die dies nutzen. Die meisten von ihnen einfach ein Zeilenlayout wiederverwenden/aufblasen und es zurückgeben.

(Ich frage, weil ich eine On-Klick-Animation in meinem ListView habe. Insbesondere this one that aims to replicate Spotify's dropdown quick action menu. Meine Animation ein wenig träge war. Nach einer Weile dieses Problem zu diagnostizieren, ich habe erkannt, dass dies aufgrund gewesen Die Tatsache, dass meine Methode getView() ein wenig Zeit in Anspruch nimmt, während ich ein neues Zeilenlayout in jeder Iteration aufblase, schlug vor, das Zeilenlayout in einem ViewHolder zwischenzuspeichern, während andere Beispiele darauf verweisen, den Parameter convertView wiederzuverwenden, dh nur ein Zeilenlayout aufzublasen wenn convertView null ist.)

Antwort

44

Ist eine zwischengespeicherte Kopie des letzten Layouts von getView() zurückgegeben?

Die convertView ist die Ansicht einer Reihe, die den Bildschirm links (so ist es nicht die letzte Ansicht von der getView Methode zurückgegeben). Zum Beispiel wird die Liste zuerst angezeigt, in diesem Fall convertView ist null, keine Zeilenansicht wurde zuvor erstellt und verließ den Bildschirm. Wenn Sie nach unten scrollen, wird Zeile 0 den Bildschirm verlassen (wird nicht mehr sichtbar sein), wenn das passiert, kann die ListView diese Ansicht in einem Cache behalten, um sie später zu verwenden (dies ist sinnvoll, wie die Zeilen eines ListView im Allgemeinen haben das gleiche Layout mit nur die Daten sind unterschiedlich). Der Grund, einige Ansichten in einem Cache zu behalten und später zu verwenden, liegt darin, dass die Methode getView oft aufgerufen werden kann (jedes Mal, wenn der Benutzer hoch/runter scrollt und neue Zeilen auf dem Bildschirm erscheinen). Wenn jedes Mal die Zeilenansicht neu erstellt werden müsste, hätte dies dazu geführt, dass viele Objekte erstellt wurden, was zu vermeiden ist.In Ihrer getView Methode würden Sie convertView überprüfen, ob es null ist. Wenn es null ist dann müssen Sie müssen eine neue Zeilenansicht erstellen und mit Daten bevölkern, wenn es nicht null ist, hat die ListView Ihnen eine vorherige Ansicht angeboten. Wenn Sie diese vorherige Ansicht verwenden, müssen Sie kein neues Zeilenlayout erstellen. Stattdessen müssen Sie mit den richtigen Daten füllen, da die zwischengespeicherte Ansicht noch mit den alten Daten verknüpft ist (Sie würden viele Fragen sehen stackoverflow, wo Benutzer fragen, warum die Zeilen ihres ListView duplizieren, wenn sie nach unten scrollen).

Was macht der Parent-Parameter? Ich habe nicht zu viele Beispiele gesehen, die dieses verwenden. Die meisten von ihnen einfach ein Zeilenlayout wiederverwenden/aufblasen und es zurückgeben.

Es sollte die richtige LayoutParams für die neu aufgeblasen/gebaut Reihe bekommen verwendet werden. Wenn Sie z. B. ein Layout mit einem als Root-Element aufblähen und das parent nicht verwenden, um das LayoutParams zu erhalten, könnten Sie Probleme mit dem Zeilenlayout haben. Zu ergreifen, um die Eltern in Betracht verwenden Sie:

convertView = getLayoutInflater().inflate(R.layout.row_layout, parent, false); 
+3

Das ist eine wirklich nette Antwort! – Tarik

+0

die beste Antwort tnx –

2

Mein Verständnis von convertView ist, dass es im Wesentlichen Ansichten, die recycelt wurden, weil sie zur Zeit nicht verwendet werden - zum Beispiel, blättern Sie durch die Liste, Die oberen sind nicht auf dem Bildschirm, daher werden sie in diesen Parameter zur Verwendung übergeben, wenn Sie eine neue Ansicht benötigen (Sie müssen also keine neue erstellen, während unbenutzte herumliegen). iOS hat eine ähnliche Methode namens dequeueReusableCellWithIdentifier. Wenn jede Zeile Ihres Listenansichts dieselbe Struktur hat, können Sie sie sicher in den entsprechenden Typ umwandeln und nur die darin enthaltenen Informationen aktualisieren - Text, Bilder usw. Es wird eine Ansicht sein, die zuvor von einem getView() Aufruf für dasselbe zurückgegeben wurde Liste.

Meine beste Schätzung (und es ist zugegebenermaßen eine Vermutung) mit parent ist, dass es die Ansicht ist, dass die Liste dieses Adapters ein Kind von ist. Sie erhalten einen Weg zurück zum Rendering-System, wenn Sie einen Kontext benötigen, auf das Ressourcensystem zugreifen, Informationen an die übergeordnete Ansicht der Liste übergeben oder Informationen von dieser erhalten.