Aufruf eines Fragment
von einem Activity
, ich zeige ein ListView
mit zwei Buttons
. Wenn ich auf ein menu_item
(d. H. Online zeigen) klicke, aktualisiere ich die Daten und so das ListView
. Jetzt muss ich die aktualisierten Daten widerspiegeln. Wie kann ich Fragment
aktualisieren, nachdem ich auf Online anzeigen geklickt habe? Bis jetzt habe ich den folgenden Code verwendet:
Aber das wird den ganzen Activity
neu starten. Ich muss nur die aktuelle Fragment
aktualisieren.
Bearbeitet: Code hinzugefügt
AKTIVITÄTSKLASSE
%Vor%Fragment
%Vor%Adapter :
%Vor% Je nachdem, wie genau Sie ListView
und Adapter
implementiert haben, haben Sie mehrere Möglichkeiten, dies zu lösen.
notifyDataSetChanged()
Adapter
Dies ist die beste Lösung, die es gibt, aber Sie müssen die List
ändern, die Adapter
verwendet, damit dies funktioniert. Zum Beispiel, wenn Sie ArrayAdapter
wie folgt verwenden:
Wie Sie sehen können, ist die String[]
die DataSource für unsere Adapter
. Wir können das Array so modifizieren, aber diese Änderungen werden nicht sofort in ListView
:
Nur wenn wir notifyDataSetChanged()
aufrufen, wird ListView
aktualisiert:
Aus der Dokumentation :
public void notifyDataSetChanged ()
Benachrichtigt die angehängten Beobachter, dass die zugrunde liegenden Daten vorhanden waren geändert und jede View, die den Datensatz widerspiegelt, sollte sich selbst aktualisieren.
Aber NICHT verwirren notifyDataSetChanged()
mit notifyDataSetInvalidated()
, weil notifyDataSetInvalidated()
etwas völlig anderes macht und nur Ihre ListView
versauen würde.
Aus der Dokumentation :
public void notifyDataSetInvalidated ()
Benachrichtigt die angehängten Beobachter, dass die zugrunde liegenden Daten nicht mehr vorhanden sind gültig oder verfügbar. Nach dem Aufruf ist dieser Adapter nicht mehr gültig und sollte keine weiteren Datensatzänderungen melden.
Adapter
Das ist ziemlich einfach. Jedes Mal, wenn Sie ein neues Adapter
festlegen, aktualisiert sich ListView
automatisch. Wenn du notifyDataSetChanged()
aus irgendeinem Grund nicht benutzen kannst, musst du es so machen. Erstellen Sie einfach jedes Mal, wenn Sie Ihr Adapter
aktualisieren möchten, ein neues ListView
:
Und verwende setAdapter()
, um es auf ListView
:
Dies wird immer ListView
aktualisieren, aber es gibt ein paar Probleme mit dieser Lösung. In erster Linie jedes Mal, wenn Sie ListView
auf diese Weise aktualisieren, würde es zurück nach oben scrollen, was ziemlich nervig sein kann, wenn es häufige Updates gibt oder wenn in ListView
viel Inhalt vorhanden ist.
BEARBEITEN:
Es gibt ein paar Dinge in Ihrem Code, die nicht optimal sind. In erster Linie sollte Ihr Adapter
den Code zum Herunterladen der Kontakte nicht enthalten. Es gehört einfach nicht dorthin, die einzige Verantwortung eines Adapter
sollte sein, dass er Views
aus einer gegebenen Datenquelle erstellt. Also sollten Sie zuerst die Methode getAllContacts()
außerhalb von Adapter
verschieben. Ich schlage vor, Sie erstellen statische Hilfsmethode dafür, ich nahm mir die Freiheit, Ihren Code entsprechend zu ändern:
Mit diesem Code können Sie alle Kontakte wie folgt erhalten:
%Vor% Danach müssen wir Ihre Adapter
ändern, damit notifyDateSetChanged()
funktioniert:
Ich habe mehrere Dinge in diesem Adapter
geändert. In erster Linie ist die List
von Contacts
nun endgültig und ich habe eine Methode contacts()
hinzugefügt, um die List
verfügbar zu machen, damit wir die Daten in Adapter
von außen modifizieren können. Ich habe auch das Ansichtshalter-Muster implementiert, damit dein ListView
schneller und glatter läuft!
Ich hoffe, ich habe nichts vergessen, aber das sollten alle Änderungen sein, die Sie brauchen. Du kannst das neue Adapter
wie folgt verwenden:
Wenn Sie später ListView
aktualisieren möchten, müssen Sie List
in Adapter
folgendermaßen ändern:
Ich hoffe, ich könnte Ihnen helfen und wenn Sie weitere Fragen haben, zögern Sie nicht zu fragen!
Tags und Links android listview android-fragments android-listview