Android - EditTexts innerhalb von ListView an Custom ArrayAdapter gebunden - Verfolgung von Änderungen

8

Ich habe eine Android-Aktivität, bei der ich eine ListView an einen benutzerdefinierten ArrayAdapter gebunden habe. Jede Zeile der ListView hat zwei EditText (numerische) Felder.

Der ArrayAdapter wird anfänglich von einer SQLite-DB aufgefüllt. Der Benutzer kann jedoch eine Zeile am Ende der ListView hinzufügen oder (durch langes Drücken auf eine Zeile) eine Zeile in der ListView löschen. Wenn sie auf die Schaltfläche "Speichern" klicken, werden ihre Änderungen beibehalten.

Ich behalte die Änderungen im Auge, indem ich einen CustomTextWatcher für das AfterTextChanged () -Ereignis an jeden EditText in der getView () -Methode des ArrayAdapters anfüge (und dann den EditText und das entsprechende Objekt in der ArrayAdapter-Objektliste übergibt) Setzen Sie die passende Eigenschaft dieses Objekts auf den Inhalt des EditText. Dies ist so, dass ich beim Speichern einfach die zugrunde liegende Objektliste durchlaufen und die entsprechenden DB-Änderungen vornehmen kann, in dem Wissen, dass die Objektliste aktuell ist.

Code für die Adapterklasse und den CustomTextWatcher:

%Vor%

Dies funktioniert alles gut, außer wenn Elemente hinzugefügt oder gelöscht werden, wenn unerwünschte Duplizierung von EditText-Inhalt passiert.

Um mit einem Beispiel zu veranschaulichen:

Beginne mit 3 Zeilen, EditText ist leer Geben Sie in Zeile 2 '5', '6'
ein Klicken Sie auf "Mehr" - & gt; Fügt am Ende eine (leere) Zeile hinzu. Jetzt 4 Reihen.
Letzte Zeile löschen- & gt; 3 angezeigte Zeilen, ABER 2. UND 3. Zeile zeigen jetzt '5', '6' - & gt; ???????

an

Es sieht so aus, als ob die relative Position von EditText-Objekten in der ListView nach der erneuten Bindung, die das Problem verursacht, nicht stabil ist. Z.B. EditText-Objekt 'X' beginnt an Position 3, dann nach einer erneuten Bindung an Position 1 - aber es ist noch ein CustomTextWatcher angehängt, der auf das Datenobjekt in Position 3 verweist. Das andere Problem ist, dass addTextChangedListener () keinen Einfluss hat Die TextWatchers sind bereits an den EditText angehängt.

Ich bin ziemlich neu in Android, daher bin ich mir nicht sicher, ob es einen besseren Ansatz zur Lösung meines Problems gibt. Jede Hilfe wird geschätzt.

    
Michael 12.10.2011, 06:08
quelle

1 Antwort

9

Es sieht so aus, als ob ich eine benutzerdefinierte Klasse ('ViewHolder') benötigte, um die Referenzen zwischen einem EditText und dem zugehörigen Datenobjekt bei jeder 'Bindung' der Daten korrekt zu synchronisieren. Wenn das Ereignislistener aufgerufen wird, wenn das convertView-Objekt in der Methode getView () den Wert null hatte, bedeutet dies, dass pro EditText-Objekt nur ein Listener hinzugefügt wurde.

Danke an Ссылка , um mich in die richtige Richtung zu weisen.

%Vor%     
Michael 12.10.2011, 23:29
quelle