Ich erhalte Daten von einem Web-Service, der in ein Objekt in der Klasse Application
geparst wird. Dieses Objekt, das in meinem Fall eine Report
-Klasse ist, enthält eine Liste von Tabs
, die das ViewPager
auffüllen sollte. Daher wird dieser Bericht im Parameter currentReport
in der Application-Klasse gespeichert.
Jede Registerkarte sollte eine Seite in ViewPager
sein. Zum ersten Mal, wenn ich die Daten erhalte und analysiere, funktioniert alles einwandfrei und der View Pager ist mit den richtigen Daten gefüllt und präsentiert sie.
Mein Problem beginnt, wenn ich eine neue Report
vom Server bekommen und die ViewPager
mit den neuen Daten aktualisieren möchte, die in den Parameter currentReport
analysiert wurden.
Mein ViewPager
ist wischbar und hat Tabs navigation. Wenn ich versuche, ViewPager
mit dem neuen Report
erneut zu instanziieren, sehe ich die richtige Anzahl an Tabs, die zu tabHost
hinzugefügt wurden. Aus irgendeinem Grund überlappten die Fragmente des neuen Berichts das Fragment des vorherigen. Wenn also die Anzahl der Registerkarten im neuen Bericht größer ist als die der Registerkarten im vorherigen Bericht, dann kann ich die Registerkarten des vorherigen Berichts zusätzlich zu den neuen Registerkarten sehen (wenn ich zum Beispiel im ersten Bericht eine Registerkarte hatte, und in der neuen habe ich 3 dann sehe ich das eine Fragment von der vorherigen und die letzten 2 von der nächsten.
Ich habe meine Entwicklung aus diesem Tutorial heraus gestartet und dazu den Code hinzugefügt: Ссылка
Dies ist mein Tab Aktivitätscode:
%Vor%und das ist mein Adaptercode:
%Vor%Meine AsyncTask, die die Daten analysiert und den ViewPager aktualisiert:
%Vor%Antwort: Nach dem @Luprospro Rat für alle Leute, die über das gleiche Problem stolpern, ist dies das Endergebnis, das für mich funktioniert, in der AsyncTask musste ich das hinzufügen:
%Vor% Wenn die beiden wichtigsten Punkte darin bestehen, die zuvor hinzugefügten Fragmente aus dem FragmentManager
/ SupportFragmentManager
mit einem FragmentTransaction
zu entfernen, um den korrekten Satz von Fragmenten in ViewPager
anzuzeigen und alle Ansichten aus dem% co_de zu entfernen % bevor neue hinzugefügt werden.
Ich bin mir nicht sicher, ob du das gelöst hast, wenn ja, ignoriere meine Antwort. Der von Neron T
bereitgestellte Link ist wichtig (wichtiger sind die dort gegebenen Hinweise, um die Fragmente des Adapters nicht zu referenzieren).
Wenn Sie den Adapter das zweite Mal mit den neuen Daten festlegen, sehen Sie die alten Fragmente aufgrund der Art und Weise, wie% ce_de% implementiert ist. Wenn Sie den Adapter erneut festlegen, führt der Adapter zuerst die FragmentPagerAdapter
-Methode aus, in der das Fragment von < destroyItem()
> getrennt wird. Als nächstes führt der Adapter die Methode ViewPager
aus. Bei dieser Methode wird eine Überprüfung für instantiateItem()
durchgeführt, um festzustellen, ob eines der vorherigen Fragmente noch nicht verfügbar ist. Diese Überprüfung wird die alten Fragmente finden (zumindest für die alten Positionen, deshalb erhalten Sie neue Fragmente für die Position, die nicht in der vorherigen Situation waren, in diesem Moment gab es kein Fragment), weil sie einfach von der% -Position getrennt sind. co_de% (aber immer noch verfügbar in FragmentManager
bis ViewPager
). Wenn ein Fragment nicht in FragmentManager
nur dann gefunden wird, wird die Methode findFragmentByTag()
aufgerufen und ein Fragment aus Ihrer Liste abgerufen.
Sie sollten Ihren Code überarbeiten, um die Listenreferenz auf diese Fragmente zu entfernen. Es gibt andere Möglichkeiten, die Fragmente aus dem FragmentManager
(nicht ganz ideal) zu erhalten. Als schnelle Lösung könnten Sie versuchen, die alten Fragmente manuell aus dem getItem()
(kurz bevor der neue Adapter gesetzt wurde) zu entfernen, um zu erzwingen, dass die Methode ViewPager
immer FragmentManager
:
Dies ist nicht getestet, also versuchen Sie es und sehen, ob es funktioniert.
Ich werde etwas von meinem Code veröffentlichen, damit Sie eine Idee bekommen.
Adapter Initialisierung und setzen Sie es auf den View-Pager.
%Vor%jedes Mal, wenn neue Daten kommen und ich rufe unten Methode:
updateUi () -Methode
%Vor%In der TestFragmentAdapter-Klasse gibt es Methoden zum Hinzufügen und Löschen der Fragmente aus View-Pager.
TestFragmentAdapter-Klasse
%Vor%TestFragment-Klasse
%Vor%Wenn neue Daten kommen, rufe ich den folgenden Code an. Ich entferne alle Ansichten vom Adapter und erstelle neue 1 und setze sie jedes Mal auf den View-Pager. Du solltest das auch in deinem Code versuchen, es sollte funktionieren.
%Vor%hoffe diese Hilfe für Sie und Sie werden eine Lösung finden.
Tags und Links android android-fragments android-viewpager