Benutzerdefinierter Cursoradapter, der bindView mehrmals aufruft

9

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?

    
HGPB 08.03.2013, 15:21
quelle

3 Antworten

13

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 .     

CaseyB 08.03.2013, 15:30
quelle
11

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?

    
aaronmarino 10.06.2014 11:23
quelle
0

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%     
Dave Cole 26.04.2014 10:52
quelle