Seltsames Problem beim Aktualisieren des ViewPagers mit neuem Inhalt:

8

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.

    
Emil Adz 06.06.2013, 14:24
quelle

3 Antworten

4

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 :

aufruft %Vor%

Dies ist nicht getestet, also versuchen Sie es und sehen, ob es funktioniert.

    
Luksprog 15.06.2013, 09:45
quelle
4

Es gibt 2 Lösungen für dieses Problem:

Lösung 1 - die einfache Siehe hier: Ссылка

Im Grunde müssen Sie diesen Code zu Ihrem Viewpager-Adapter hinzufügen:

%Vor%

Lösung 2 - die empfohlene wird hier gut erklärt: Ссылка

    
Lior Iluz 09.06.2013 09:08
quelle
1

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.

    
TheFlash 15.06.2013 09:36
quelle