Löschen von Elementen aus einem ListView mit einem benutzerdefinierten BaseAdapter

8

Ich verwende einen angepassten BaseAdapter, um Elemente in einer ListView anzuzeigen. Die Elemente sind nur Zeichenfolgen, die in einer ArrayList gehalten werden.

Die Listenelemente haben eine Löschschaltfläche (großes rotes X), und ich möchte das Element aus der ArrayList entfernen und die ListView benachrichtigen, sich selbst zu aktualisieren.

Allerdings werden bei jeder Implementierung, die ich ausprobiert habe, mysteriöse Positionsnummern angegeben. Wenn Sie also auf die Schaltfläche zum Löschen von Element 2 klicken, wird Element 5 gelöscht. Es scheint fast völlig zufällig zu sein.

Zu beachten ist, dass Elemente wiederholt werden können, aber in der gleichen Reihenfolge bleiben müssen. Zum Beispiel kann ich zweimal "Irisch" haben, als Elemente 3 und 7.

Mein Code ist unten:

%Vor%

Ich versuche später, die Position des gelöschten Elements durch Ergreifen des Tags zu ermitteln, aber es ist immer die falsche Position in der Liste. Es gibt kein auffälliges Muster für die hier gegebene Position, es erscheint immer zufällig.

%Vor%

Ich würde mich freuen, das Element einfach aus der ArrayList zu löschen und das ListView-Update selbst zu haben, aber die Position, die ich bekomme, ist falsch, also kann ich das nicht machen.

Bitte beachten Sie, dass ich zuerst den deleteButton clickListener in der getView-Methode hatte und 'position' verwendet habe, um den Wert zu löschen, aber ich hatte das gleiche Problem.

Irgendwelche Vorschläge geschätzt, das irritiert mich wirklich.

    
HXCaine 04.01.2011, 02:48
quelle

3 Antworten

5

Sie müssen die Position jedes Mal einstellen. Ihre Implementierung legt nur die Position für die Erstellung der Ansicht fest. Wenn die Ansicht jedoch wiederverwendet wird (wenn convertView nicht null ist), wird die Position nicht auf den korrekten Wert gesetzt.

%Vor%     
Greg Giacovelli 04.01.2011, 02:58
quelle
0

Sie müssen die OnItemClickListener-Schnittstelle implementieren und das Element in der onItemClick-Methode löschen. Ein Parameter der Methode ist die Position.

    
Gao Yuesong 04.01.2011 03:05
quelle
0

Meine endgültige Lösung bestand darin, die akzeptierte Antwort von Greg und folgende zu verwenden:

  • Speichern Sie die Halter in einer HashMap, wobei die Position des Elements die Schlüssel ist (dies wird im Konstruktor als leer initialisiert)

    private HashMap mHolders;

  • Verwenden Sie dies als onClickListener-Methode:

%Vor%

[Bitte entschuldigen Sie die seltsame Formatierung. Die Code-Einbettung funktioniert nicht richtig]

    
HXCaine 05.01.2011 23:49
quelle