Ich versuche in meinem zu verwenden Android Application
das notifyDataSetChanged()
für ein Verfahren , ArrayAdapter
aber es für mich nicht funktioniert.
ich fand als Antwort , dass notifyDataSetChanged()
das im Haupt-Thread laufen sollte, aber es gab kein Beispiel dafür.
Könnte jemand ein Beispiel oder zumindest einen Link senden?!
Antworten:
Für einen umfassenden
ArrayAdapter
,notifyDataSetChanged
funktioniert nur , wenn Sie die verwendenadd()
,insert()
,remove()
, undclear()
auf dem Adapter.Wenn ein erstellt
ArrayAdapter
wird, enthält es die Referenz für das übergebeneList
Element. Wenn SieList
ein Mitglied übergeben, das Mitglied einer Aktivität war, und dieses Aktivitätsmitglied später ändern, enthält dasArrayAdapter
noch einen Verweis auf das OriginalList
. Der Adapter weiß nicht, dass Sie dasList
in der Aktivität geändert haben .Sie haben folgende Möglichkeiten:
ArrayAdapter
auf die zugrunde liegende Liste zu ändern (add()
,insert()
,remove()
,clear()
, etc.)ArrayAdapter
mit den neuenList
Daten neu. (Verbraucht viele Ressourcen und Speicherbereinigung.)BaseAdapter
und dieListAdapter
das Ändern der zugrunde liegendenList
Datenstruktur ermöglicht.notifyDataSetChanged()
jedes Mal, wenn die Liste aktualisiert wird. Verwenden Sie dasrunOnUiThread()
of , um es im UI-Thread aufzurufenActivity
. DannnotifyDataSetChanged()
wird es funktionieren.quelle
notifyDataSetChanged()
:((BaseAdapter) arrayAdapter).notifyDataSetChanged();
?Sie können die
runOnUiThread()
Methode wie folgt verwenden. Wenn Sie a nicht verwendenListActivity
, passen Sie einfach den Code an, um einen Verweis auf Ihren zu erhaltenArrayAdapter
.quelle
Ich habe kürzlich zu diesem Thema geschrieben, obwohl dieser Beitrag alt ist, dachte ich, dass er für jemanden hilfreich sein wird, der wissen möchte, wie man
BaseAdapter.notifyDataSetChanged()
Schritt für Schritt und auf korrekte Weise implementiert .Befolgen Sie die Anweisungen zum korrekten Implementieren von BaseAdapter.notifyDataSetChanged () in Android oder dem neueren Blog BaseAdapter.notifyDataSetChanged () .
quelle
mItem.add()
ich nur ein Element bearbeitet, was bedeutetmItem.get(position).setImage(encodedImage)
, dass es möglicherweise einen Fehler gibt. NullPointer-Ausnahme nur für add (), clear (), remove () usw.Ich hatte das gleiche Problem und ziehe es vor, nicht den gesamten ArrayAdapter kontinuierlich durch eine neue Instanz zu ersetzen. So lasse ich den AdapterHelper das schwere Heben woanders machen.
Fügen Sie dies dort hinzu, wo Sie normalerweise benachrichtigen würden (versuchen)
AdapterHelper-Klasse
quelle
super.addAll(..)
für API> 11 und super.add (.. ) in Kombination mit einer Iteration wie Ihrer :if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { super.addAll(items); } else { for (Object o : collection) { super.add(o); } }
. Erweitern Sie jetzt einfach Ihre neue Adapterklasse.Ich weiß, dass dies eine späte Antwort ist, aber ich hatte ein ähnliches Problem und konnte es mithilfe von lösen
notifyDataSetChanged()
der richtigen Stelle verwendete.Meine Situation war also wie folgt.
Ich musste eine Listenansicht in einer Aktionsleistenregisterkarte (Fragment) mit Inhalten aktualisieren, die von einer völlig anderen Aktivität zurückgegeben wurden. Die Listenansicht würde jedoch zunächst keine Änderungen widerspiegeln. Wenn ich jedoch auf eine andere Registerkarte klickte und dann zur gewünschten Registerkarte zurückkehrte, wurde die Listenansicht mit dem richtigen Inhalt aus der anderen Aktivität aktualisiert. Um dies zu lösen, habe ich verwendet
notifyDataSetChanged()
den Aktionsleistenadapter im Code der Aktivität verwendet, die die Daten zurückgeben musste.Dies ist das Code-Snippet, das ich in der Aktivität verwendet habe.
Diese Aktivität würde einige Daten zurückgeben
FragmentTab2
und meine Listenansicht direkt in aktualisierenFragmentTab2
.Hoffe jemand findet das nützlich!
quelle