ViewHolder - gute Praxis
Eine kleine newbie-Frage. Warum sollten wir initialisieren die ViewHolder
im getView()
? Warum können wir nicht initialisieren Sie im Konstruktor?
youtube.com/watch?v=wDBM6wVEO70. Haben Sie einen Blick auf dieses video. Sollte Ihre Frage beantworten.
InformationsquelleAutor Gorets | 2012-10-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie mehrere
ViewHolder
Objekte in die Existenz.Einen
ListView
durch seine Natur nicht erstellen Sie neueView
Instanzen, die für die einzelnen Zeilen. Dies ist so, dass wenn man eineListView
von einer million Dinge, die Sie nicht brauchen, um Shop-layout-Informationen für eine million Dinge. Also, was brauchen Sie, um zu speichern? Nur die Dinge, die auf dem Bildschirm angezeigt. Sie können dann wiederverwenden, diese Meinung immer und immer wieder. Auf diese Weise werden IhreListView
eine million Objekte können nur vielleicht 10 untergeordneten Ansichten.In Ihrer benutzerdefinierten array-adapter, müssen Sie eine Funktion namens
getView()
etwa wie folgt aussieht:Dies funktionieren wird, aber einen moment Zeit nehmen und sehen, ob Sie können vor Ort die Ineffizienz hier. Überlegen Sie sich, welche der obige code aufgerufen wird, Redundant.
Das problem ist, dass wir fordern
row.findViewById
immer und immer wieder, obwohl nach dem ersten mal schauen wir es wird sich nie ändern. Während, wenn Sie nur eine einfacheTextView
in deiner Liste, es ist wahrscheinlich nicht so schlimm, wenn Sie ein Komplexes layout, oder Sie haben mehrere Ansichten, die Sie festlegen möchten Daten, die Sie verlieren könnten, ein bisschen Zeit finden, Ihre Ansicht über und über wieder.So, wie lösen wir das? Naja, würde es Sinn machen, zu lagern, dass TextView irgendwo, nach dem wir suchen. So führen wir eine Klasse namens ein
ViewHolder
, die "hält" die Ansichten. Also im inneren des Adapters, die Einführung einer inneren Klasse in etwa so:Diese Klasse ist privat, da es nur ein caching-Mechanismus für den adapter, und es ist statisch, so dass wir nicht brauchen eine Referenz auf den adapter zu verwenden.
Store unserer Sicht so, dass wir nicht zu nennen
row.findViewById
mehrere Male. Wo sollen wir das einstellen? Wenn wir Blasen den Blick für die erste Zeit. Wo speichern wir es? Aussicht haben eine eigene "tag" - Feld, das verwendet werden kann zum speichern von meta-Informationen über die Sicht - genau das, was wir wollen! Dann, wenn wir haben bereits gesehen, diese Ansicht, wir müssen nur schauen, bis der tag statt, sucht sich jede der Ansichten innerhalb der Zeile..Also die if-Anweisung innerhalb der
getView()
wird:Nun, wir haben gerade ein update der Halter.textView text Wert, da es bereits einen Verweis auf das Recycling-Ansicht! Also unsere letzten adapter s-code wird:
Und wir sind fertig!
Einige Dinge zu denken:
TextView
Objekte und eineImageView
holder.textView.getText()
ist, bevor Sie es aktualisieren am Ende dergetView()
Kein problem - lassen Sie mich wissen, ob alles Sinn macht, den ViewHolder, was definitiv verwirrt mich eine Weile, als ich zuerst davon erfuhr.
Wow. Ausgezeichnete Antwort. Als eine Herausforderung für Sie; verbessern Sie es mit ein paar Referenzen? =)
Sehr gute Antwort und hat mir wirklich geholfen zu verstehen, das Konzept. Jetzt habe ich aber Zweifel daran. Was, wenn wir das Objekt mit der ViewHolder innerhalb Konstruktor des Adapters, und speichern Sie das Objekt irgendwo und in der getview-Methode jedes mal erhalten, die gespeichert ViewHolder-Objekt und verwenden Sie es????????
InformationsquelleAutor mindvirus
Als wir durch die Liste scrollen, jedes mal, wenn Zeile füllen und neue Zeile anzeigen, erstellen Sie für jede Zeile, die wir brauchen, um init der view-Halter. Wie habe ich zwei TextView in der Zeile dann,
InformationsquelleAutor Imran Ali