Aktuelles Fragment aktualisieren (ListView-Daten), das in derselben Aktivität verbleibt

8

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:

%Vor%

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%     
BST Kaal 09.07.2014, 09:27
quelle

2 Antworten

14

Je nachdem, wie genau Sie ListView und Adapter implementiert haben, haben Sie mehrere Möglichkeiten, dies zu lösen.

  1. Durch Aufruf von notifyDataSetChanged()
  2. Durch Zurücksetzen der Adapter

Aktualisierung mit notifyDataSetChanged ()

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:

%Vor%

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 :

widergespiegelt %Vor%

Nur wenn wir notifyDataSetChanged() aufrufen, wird ListView aktualisiert:

%Vor%

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.

Aktualisierung durch Zurücksetzen der 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 :

%Vor%

Und verwende setAdapter() , um es auf ListView :

zu setzen %Vor%

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:

%Vor%

Mit diesem Code können Sie alle Kontakte wie folgt erhalten:

%Vor%

Danach müssen wir Ihre Adapter ändern, damit notifyDateSetChanged() funktioniert:

%Vor%

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:

%Vor%

Wenn Sie später ListView aktualisieren möchten, müssen Sie List in Adapter folgendermaßen ändern:

%Vor%

Ich hoffe, ich könnte Ihnen helfen und wenn Sie weitere Fragen haben, zögern Sie nicht zu fragen!

    
Xaver Kapeller 09.07.2014, 09:35
quelle
1

Wenn du in einem Fragment bist, kannst du

machen %Vor%     
Kaustubh 09.07.2014 09:31
quelle