Ich habe dieses Problem seit Monaten und Monaten (aber jetzt bin ich Performance-Tuning) leiden. Jetzt muss ich jedoch dringend wissen, warum mein Adapter es für nötig hält, bindView
bis zu 4 Mal auf einem Datensatz auszuführen.
Ich habe einen benutzerdefinierten Cursor-Adapter, der eine Gridview auffüllt.
Einige Debuggen, um zu zeigen, was vor sich geht:
%Vor% Der "Avatar leer ..." und "Bilderstellung ..." ist einfach Debug, der mir sagt, dass es 2 spezielle ImageView
s verarbeitet und aktualisiert.
Warum o warum läuft bindView
so oft? Was sind die Gründe dafür und was kann ich tun, um dies zu beheben?
Logisch gesehen, dass bindView
einmal ausgeführt wird (und jedes Mal, wenn der Adapter aktualisiert wird), irre ich das?
Das Betriebssystem kann bindView
mehrmals aufrufen, damit es die Liste korrekt messen und auslegen kann. Dies ist kein Fehler so sehr wie es sein muss. Dies, zusammen mit der Weichheit des Scrollens, ist der Grund, warum bindView
Implementierungen so effizient wie möglich sein müssen. Es gibt einige nette Tipps und Tricks, die Sie ausführlich auf der Android Developers Page .
Ich fand auch, dass bindView viel öfter aufgerufen wurde als erwartet. Meine ListView-Höhe wurde auf wrap_content festgelegt. Nach dem Ändern in match_parent wurde die Anzahl der Anrufe drastisch reduziert.
Kredit für diese Lösung geht auf die Antwort für diese Frage CustomColorAdapaters bindView hat 77 Mal aufgerufen ... habe ich etwas falsch gemacht?
Eine Sache, die ich mit ImageView
entdeckt habe, ist, dass das Ändern des Bildes dazu führt, dass ImageView
ein Layout anfordert, wenn das neue und das alte Bild nicht genau die gleiche Größe haben.
Intern verwendet das ImageView
getIntrinsicWidth()
und getIntrinsicHeight()
, um herauszufinden, ob ein Layout angefordert werden soll oder nicht.
Versuchen Sie etwas Ähnliches (obwohl es sinnvoller wäre, die aktuelle Breite / Höhe an Ihre asynchrone Ladung zu senden und die Größe der Bitmap zu ändern, bevor Sie vom Hintergrund zurückkehren):
%Vor%Tags und Links android android-cursoradapter android-gridview