ListView wird nicht aktualisiert, wenn notifyDataSetChanged von einem BaseAdapter aufgerufen wird

8

Ich habe Schwierigkeiten, eine ListActivity zu aktualisieren, wenn sich die zugrunde liegenden Daten ändern.

Ich verwende einen benutzerdefinierten (Listen-) Adapter (CustomListAdapter), der vom BaseAdapter abgeleitet wurde, um eine ListActivity mit benutzerdefinierten Listenelementen (CustomListElement) zu füllen.

Bei den betreffenden Elementen können sich die zugrunde liegenden Daten im Laufe der Zeit ändern, entweder durch Benutzerinteraktion oder durch Änderungen in einer zugrunde liegenden Datenbank. Um diese Änderungen anzukündigen, können die Objekte CustomListElement und CustomListAdapter DataSetObserver-Objekte registrieren.

Dies wird im Wesentlichen so gemacht (leider würde der gesamte Code übertrieben werden):

%Vor%

Daher stellt ein CustomListElement registerDataSetObserver durch Vererbung von DataSetObservable zur Verfügung und kündigt Änderungen mit seiner Methode notifyChanged () an.

Und für den CustomListAdapter:

%Vor%

i.e. die Beobachter werden "durchgereicht".

Jetzt beim Aufruf von

%Vor%

Innerhalb einer ListActivity sollte dies ein android.widget.AbsListView.AdapterDataSetObserver innerhalb der setAdapter-Methode von ListView (aufgerufen von setListAdapter von ListActivity).

Nach der Benachrichtigung der registrierten DataSetObserver-Objekte bei jeder Änderung sollte die onChanged-Methode des AdapterDataSetObserver und damit requestLayout der ListView aufgerufen werden. Dies sollte (zu meinem Verständnis) die ListView aktualisieren.

Das ListView wird jedoch nicht mit den neuen Daten aktualisiert.

Ich weiß, dass darauf hingewiesen wurde, dass notifyDataSetChanged und (vielleicht) notifyChanged innerhalb einer runOnUiThread-Umgebung ausgeführt werden sollten, aber das scheint das Problem nicht zu beheben.

Ich stelle auch fest, dass ähnliche Fragen aufkamen, aber nicht mit dieser speziellen Gruppe von Android-Klassen und mit unbefriedigenden Antworten.

Vermisse ich etwas? Jeder Einblick in warum dies bricht und wie es zu beheben ist sehr geschätzt.

    
Hauke 07.12.2010, 11:03
quelle

3 Antworten

7

Der registerDataSetObserver() -Teil der Schnittstelle Adapter ist für alle externen Objekte gedacht, die möglicherweise wissen möchten, wann sich der Datensatz ändert. A ListView sollte nicht wirklich an diesen Methoden interessiert sein ... wenn es BaseAdapter content changes ist, rufst du BaseAdapter.notifyDataSetChanged() an, was die ListView auffordert, sich selbst zu aktualisieren.

Mit anderen Worten, Sie müssen nur die folgende kleine Änderung vornehmen:

%Vor%

Tatsächlich ist notifyDataSetInvalidated () eine bessere Wahl, da Sie den Status eines vorhandenen Elements ändern (statt neue hinzuzufügen).

Und natürlich brauchen Sie nichts von diesem DataSetObserver-Zeug, es sei denn, Sie haben tatsächlich andere Objekte, die über diese Daten wissen müssen.

    
Reuben Scratton 07.12.2010 11:33
quelle
1

Das Problem wurde behoben. Das Problem war tatsächlich an einem anderen Punkt (eine Zwischenklasse, die hier nicht erwähnt wurde, reagierte nicht angemessen auf Änderungen). Der ursprüngliche Code funktioniert wunderbar.

Vielen Dank für die Mühe,

    
Hauke 07.12.2010 14:56
quelle
1
%Vor%     
parthasarathy 16.11.2013 14:17
quelle

Tags und Links