Meine Fragmente auf der Registerkarte "viewpager" werden nicht aktualisiert

8

Ich habe Viewpager mit 4 Tabs. In jedem Tab gibt es ein Fragment. Meine erste Registerkarte ist ein Fragment mit einem Formular (zum Beispiel Benutzer) Nachdem ich auf Speichern geklickt habe, werden die Daten in die Datenbank eingefügt. meine zweite Registerkarte ist ein weiteres Fragment mit Formular, aber es verwendet Daten aus der ersten Registerkarte (ich erhalte es aus der Datenbank), um ein Spinner zu füllen. Nachdem ich erfolgreich Daten von meinem ersten Tab eingefügt habe, ist der Spinner in meinem zweiten Tab leer. Da meine DB-Abfrage in onCreateView () im zweiten Fragment implementiert ist, wird sie nur einmal aufgerufen, wenn die Anwendung gestartet wird, so dass der Wechsel zwischen Tab 1 und Tab2 nicht bei CreateView () oder OnResume () startet. Die interessante Sache für mich ist, dass, wenn ich zu Tab4 gehe und dann zu Tab2 zurückkehre, meine Daten richtig in meinem Spinner sind, also irgendwie zwei Tabs von meinem aktuellen Tab wischend, mein Fragment auffrischend. Meine Frage ist, wie kann ich eine korrekte Aktualisierung meines Fragments erreichen, wenn onCreateView () nur einmal aufgerufen wird?

Bearbeiten Ich habe versucht, diese Methode psykhi vorgeschlagen, wie folgt:

%Vor%

aber es funktioniert nicht für mich. Fehle ich etwas?

    
BlastFire 08.02.2013, 12:54
quelle

7 Antworten

14

UPDATE: Es gibt einen besseren Weg. Bitte schau hier: ViewPager dynamisch aktualisieren?

Der Inhalt dieser Antwort wurde entfernt, weil es eine wirklich schlechte Möglichkeit war, auf Fragment s innerhalb von ViewPager zuzugreifen, siehe den obigen Link für eine bessere Vorgehensweise.

    
M-WaJeEh 08.02.2013, 13:37
quelle
9

Der beste Weg, den ich entdeckt habe, um ein "setOffscopePageLimit (0)" - Verhalten zu simulieren, besteht darin, einen OnPageChangeListener in Verbindung mit dem Überschreiben der Methode getItemPosition in Ihrem Adapter zu verwenden. Etwas wie das:

In Ihrem benutzerdefinierten Pager-Adapter:

%Vor%

Dann in Ihrer Aktivität, die den ViewPager enthält:

%Vor%

Dies sollte den gleichen Effekt haben wie das OffscreenPageLimit auf 0 zu setzen. Diese Funktionalität ist jedoch etwas gegen das, was der ViewPager bereitstellen soll. Wenn Sie versuchen, einen ViewPager auf diese Weise zu implementieren, kann es sinnvoll sein, Ihr Layout erneut zu überprüfen, um sicherzustellen, dass ein ViewPager wirklich das ist, was Sie verwenden möchten.

    
Dave 23.04.2013 16:19
quelle
2

Das liegt daran, dass Sie die Anzahl der Fragmente angeben können, die Ihr Viewpager im RAM behalten soll ( setOffScreenPageLimit (): Ich denke, der Standardwert ist 1). Also wird Ihr zweites Fragment nicht neu geladen. Und wenn Sie zu einem Tab 3 oder 4 gehen, werden Ihre 2 ersten Fragmente gelöscht und dann neu erstellt, wenn Sie zurückkommen.

Um Ihr Fragment zu aktualisieren, gibt es viele Möglichkeiten: Sie könnten eine eigene Listener-Schnittstelle implementieren, um zu bestimmen, wann sie aktualisiert werden soll, oder einfach eine Methode aufrufen, die Sie implementieren, um Ihre Inhalte zu aktualisieren. p>     

psykhi 08.02.2013 13:02
quelle
1

Akzeptierte Antwort ist nicht zu klar für grundlegende Entwickler, deshalb einfache Lösung hinzugefügt. nach langem Kampf Arbeitslösung finden.

Just Benachrichtigung an Ihren Adapter , es funktioniert erstaunlich,

  

Referenzcode

%Vor%
  

rufen Sie diesen Code auf, wenn Sie den Adapter festlegen und wenn Sie die Benutzeroberfläche aktualisieren möchten.

Fügen Sie in Ihrem Fragment den folgenden Code zum Aktualisieren der Benutzeroberfläche hinzu

%Vor%

Verwende instanceof für den Casting-Kontext.

Dieser Code teilt nur helfenden Zwecken, die mit minimalem Code eine funktionierende Lösung finden

    
Yogesh Rathi 24.09.2016 11:27
quelle
1

überschreiben Sie zuerst in der Fragmentmethode

%Vor%     
Issac Balaji 23.11.2016 11:50
quelle
0

Nach meiner Erfahrung behalten ViewPagers:

  • Ihr aktueller Tab
  • & amp; 1 Registerkarte auf jeder Seite im Speicher

Wenn Sie also zwischen 1 und 2 wechseln, passiert nichts unter der Haube - es ist, als würden sie einfach nur versteckt / gezeigt.

Wenn Sie jedoch zu Registerkarte 4 navigieren, werden die Registerkarten 1 & amp; 2 werden zerstört (onDestroy () genannt). Wenn Sie also zu einem von beiden zurück navigieren, werden sie neu erstellt (onCreate () aufgerufen).

Als psykhi empfiehlt es sich, setOffScreenPageLimit () bis 0, so dass jedes Fragment jedes Mal erstellt wird, wenn Sie Navigiere dorthin.

Wenn Sie die anderen Seiten für Leistungszwecke im Speicher behalten möchten, wie sie mit mind / entworfen wurden, können Sie ein Nachrichten- / Ereignisveröffentlichungssystem verwenden, um eine Nachricht von Registerkarte 1 zu senden auf Tab 2, um es zu aktualisieren, wenn Sie das Formular auf Tab 1 senden.

    
Cillian Myles 21.01.2016 10:30
quelle
0

Ok kann eine späte Antwort sein, könnte anderen in Zukunft helfen, so vor kurzem sah ich das gleiche Problem beim Abrufen von Daten aus db in Tabs es nur angezeigt, wenn ich auf 3. Registerkarte klicke .. Ich versuchte oben genannten Lösung aber nichts wirklich arbeitete .. fianlly Ich stieß auf Otto Diese Bibliothek ermöglicht Ihnen, in Ihrer App zu kommunizieren.

Verwenden Sie diese Bibliothek einfach zu IhrerAdapter.notifyDataSetChanged (), wo immer Sie Ihre Daten von db .. abholen.

Dieses Video hat mir sehr geholfen Ссылка

    
fasal shah 28.04.2016 10:19
quelle