ListView zeigt keine Änderungen an, bis sich der Fokus nach notifyDataSetChanged ändert

Kitalda

Ich habe eine AlertDialogmit einem ListViewSatz zur Mehrfachauswahl drauf. Es hat auch eine Buttondrauf.

Die Buttonandere offen , AlertDialogdass , wenn ok'ed wird die ausgewählten Elemente aus dem Datensatz der entfernen ListView, und dann dem Adapter aus der Listenansicht sagen , dass der Datensatz mit der geändert hat notifyDataSetChanged()Methode.

Dies alles funktioniert gut, bis auf eine Sache. Der ListViewInhalt wird erst aktualisiert, wenn ich mit etwas interagiere. Dann wird es auf die richtigen Daten aktualisiert.

Dies ist kein großes Problem, aber ich möchte wirklich, dass das ListViewsofort korrekt erscheint und nicht erst, nachdem sich der Fokus geändert hat.

Code:

Button remove = (Button) view.findViewById(R.id.btn_remove_questions_edit_rack);
    final Context con = this;
    remove.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Builder warnBuild = new Builder(con);
            warnBuild.setMessage(R.string.question_deletion_warning);
            warnBuild.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    SparseBooleanArray checked = list.getCheckedItemPositions();
                    for (String s : keys)
                    {
                        int i = keys.indexOf(s);
                        if (checked.get(i))
                        {
                            toRemove.add(map.get(s));
                            map.remove(s);
                        }
                    }
                    keys.clear();
                    keys.addAll(map.keySet());
                    ((ArrayAdapter) list.getAdapter()).notifyDataSetChanged();
                    list.clearChoices(); //This makes sure the selection is cleared, if it isn't, some of the other items (those that now has the index of the selected items) will be selected when the View refreshes.
                    dialog.dismiss();
                }
            });

            //Negative button here, not relevant.
        }
    });

Wo mapund keyssind:

final HashMap<String, QualityQuestion> map = new HashMap<>();
//I add items to the map
final ArrayList<String> keys = new ArrayList<>(map.keySet());

Und toRemovehier speichere ich die Elemente, die aus dem eigentlichen Objekt entfernt werden sollen, auf dem sie sich befinden, wenn die OK-Taste auf dem Original AlertDialoggedrückt wird.

So bevölkere ich meine ListViewin erster Linie:

final ListView list = (ListView) view.findViewById(R.id.list_questions_edit_rack);
    list.setAdapter(
            new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_activated_1,
                    keys));

Ich habe Dinge wie und andere Dinge ausprobiert list.invalidateViews(), die list.invalidateich in Fragen gefunden habe, die meinen hier auf SO ähnlich sind. Aber nichts davon machte einen Unterschied. Ich vermute, dass sich mein Problem von ihrem unterscheidet, da meine Artikel eindeutig aktualisiert wurden. Es ist lediglich eine Änderung des Fokus auf das Original erforderlich, damit AlertDialogdie Änderung sichtbar wird.

Wie kann ich ListViewdie Änderungen der Datenquelle nach einer Fokusänderung sofort anzeigen lassen?

Bö macht Blau

Durch einen Anruf

((ArrayAdapter) list.getAdapter()).notifyDataSetChanged();

Sie erhalten einen neuen Adapter, der mit ziemlicher Sicherheit nicht mit dem anonymen Adapter identisch ist, mit dem Sie Ihre Liste in erster Linie gefüllt haben.

Siehe auch die Dokumentation zu ListView.getAdapter ()

Gibt den derzeit in dieser ListView verwendeten Adapter zurück. Der zurückgegebene Adapter ist möglicherweise nicht derselbe Adapter, der an setAdapter (ListAdapter) übergeben wurde, sondern möglicherweise ein WrapperListAdapter.

Aus Sicht dieses neuen Adapters hat sich der Datensatz nicht geändert, da die Änderungen bereits vor der Instanziierung vorgenommen wurden.

Um Ihr Problem zu lösen, machen Sie Ihre Liste und Ihren Listenadapter zu Mitgliedern Ihrer Aktivitätsklasse (oder zu dem Bereich, in dem Sie sie am Leben erhalten möchten):

private ArrayList<String>    keys;
private ArrayAdapter         myAdapter;
private ListView             list;

Dann in Ihrem "onCreate ()"

keys = ...;     // initialization of ArrayList with the needed data 
myAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_activated_1,
                    keys);
list = (ListView) view.findViewById(R.id.list_questions_edit_rack);
list.setAdapter(myAdapter);

Auf diese Weise können Sie in Ihrem "OnClickListener" "myAdapter" benachrichtigen:

keys.addAll(map.keySet());
myAdapter.notifyDataSetChanged();

Hoffe das hilft :)

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Führen Sie die Funktion in useeffect aus, wenn sich der Status nach 1 Sekunde ändert, wenn sich keine anderen Änderungen ergeben

Der Fokus ändert sich nach dem Winkel der neuen Komponentenlast nicht

Der Fokus ändert sich auch nach dem Setzen von e.Handled = true

SQL Zeigt den vorherigen Wert an, bis sich der angegebene Wert ändert

OOP Pygame player_x Variable ändert sich, aber keine Änderungen in der Anzeige

Nach der Bereitstellung von War-Dateien für Tomcat zeigt die Webapp keine neuen Änderungen an

Warum ändert sich diese ListView nicht mit Änderungen an der gebundenen Eigenschaft?

Der Status ändert sich, aber die Datentabelle zeigt keine neuen Daten an

Die Nginx-, uWSGI- und Flask-App zeigt keine Änderungen an, bis der Server neu gestartet wird

Pandas - Gruppieren nach und kumulative Anzahl bis sich der Wert ändert

Selen: Scrollen Sie nach unten, bis sich der 'Stil' eines Elements ändert

Schleife, bis sich der Bildschirm ändert

Die aktive Seitenleiste von AdminLTE2 zeigt/ändert sich nur nach der Aktualisierung

Formularfelder verlieren den Fokus, wenn sich der Eingabewert ändert

Ändern Sie die Bindung, wenn sich der Fokus ändert

TextFormField-Validierung, wenn sich der Fokus ändert

Wenn sich der Pfad in proxy.conf.json geändert hat, erkennt die Java-App keine Änderungen

intField zeigt keine Änderungen an

Userform: Initialisieren, bis sich der Wert in der TextBox ändert

PowerShell zeigt keine Seite nach der Webanmeldung an

ListView zeigt keine Elemente aus der Datenbank an

ListView zeigt keine Daten aus der Firebase an

Ändert sich die Objektreferenz nach der GC?

Der Ausgabeparameterwert ändert sich je nach Fehlertyp

Der Fenstername ändert sich nach Datum QTP

Der Strukturwert ändert sich nach zweimaligem Zugriff

URL ändert sich nach der Umleitung nicht

Reagiere auf Statusänderungen, aber der Hintergrund ändert sich nicht

Android, ListView IllegalStateException: "Der Inhalt des Adapters hat sich geändert, ListView hat jedoch keine Benachrichtigung erhalten."