Warum ändert sich die Reihenfolge beim Blättern in Android GridView?

7

Ich habe eine GridView in Android, die ich mit Daten aus einer XML-Ressource gefüllt Zum Beispiel habe ich 15 Elemente in der GridView, die in der Reihenfolge angeordnet sind. Die Gesamthöhe übersteigt die Bildschirmhöhe, also muss ich scrollen, um den Rest der Elemente zu sehen.
Das Problem ist, wenn ich zurück blättern, hat sich die Reihenfolge der unsichtbaren Zeilen geändert. Es ist ein mysteriöses Verhalten, da Gegenstände manchmal miteinander vertauscht werden. Hier ist meine getView -Methode:

%Vor%

Update: Nun, es ist ziemlich merkwürdig. Nach etwas mehr Debugging habe ich festgestellt, dass der Adapter im GridView die 13. Position überspringt, was bedeutet, dass er 1 statt 13 zurückgibt und dann auf 14 weitergeht !!! (Ich denke, die 13 ist Pech!)

    
Hamed Momeni 20.05.2012, 09:27
quelle

6 Antworten

5

Wenn dies der gesamte Code ist, den Sie in der getView -Methode haben, implementieren Sie ihn nicht richtig:

%Vor%

Ich weiß nicht, ob der obige Code funktioniert, deins ist ein bisschen seltsam. Wie auch immer, ich denke, das Verhalten, das Sie sehen, ist normal, weil alles, was Sie in Ihrem Adapter tun, die ersten sichtbaren Elemente auffüllt und dann der Adapter die exact gleichen Elemente wiederverwenden wird, wenn Sie nach oben und unten scrollen Recycling. In getView solltest du:

  • Überprüfen Sie, ob convertView null ist:
    • Wenn es null ist, ist es an der Zeit, ein neues View für dieses GridView Element aufzublasen. Sie können auch das Halterungsmuster verwenden, um nach dem Composing Views zu suchen (anstatt jedes Mal mit findViewById zu suchen) (Sie verwenden das setTag -Element für die überhöhte Ansicht, aber es ist ein Stück Daten aus den Node -Daten Element?!? Was hast du damit vor???)
    • Wenn es nicht null ist, werden Sie nichts tun (oder wenn Sie das Halterungsmuster implementieren, würden Sie das Tag mit dem bereits gesuchten Views erhalten)

Und das sollten Sie in dieser if / else-Anweisung tun

  • Nach dem obigen Teil werden Sie die Views mit Daten füllen (so dass sie die entsprechenden Daten für diese Position enthalten).
Luksprog 20.05.2012, 11:49
quelle
10
%Vor%     
Abhijit Kurane 08.07.2013 09:48
quelle
3

Ihre Adapterimplementierung ist fatal fehlerhaft.

In getView() , wenn convertView ist null , blähen Sie ein Layout auf und füllen Sie seine Widgets. Das ist in Ordnung.

In getView() , wenn convertView nicht null ist, machen Sie absolut nichts. Das ist äußerst falsch.

Was Sie tun sollten in getView() , wenn convertView nicht null ist, füllt immer noch die Widgets der Zelle . convertView stellt eine Zelle dar, die wiederverwendet werden soll. Sie können also die Inflation überspringen und CPU-Zeit sparen. Sie müssen jedoch die Widgets dieser Zelle aktualisieren, um die Position wiederzugeben, die Sie in diesem spezifischen getView() -Aufruf einrichten sollen / p>     

CommonsWare 20.05.2012 11:43
quelle
1

Ich habe gerade das

gelöscht %Vor%

es funktioniert

    
Boris Karloff 11.02.2014 17:18
quelle
1

Wenn Ihr Grid-Objekt mehrere Ansichten enthält , können Sie die Methoden getTag() und setTag() verwenden. In diesem Fall ändern Gitterelemente ihre Positionen beim Scrollen nicht mehr und die Leistung ist immer noch in Ordnung:

%Vor%     
careful7j 29.09.2016 00:34
quelle
0

Ich habe diese Lösung basierend auf anderen Beispielen verwendet und gearbeitet:

%Vor%     
edwindh 02.06.2014 20:09
quelle

Tags und Links