FragmentPagerAdapter mit ViewPager und zwei Fragmenten. Gehe zum ersten von der Sekunde und aktualisiere den ersten Text

8

Ich bin nicht vertraut mit FragmentPagerAdapter , also wird dies eine dieser Fragen sein, die wir (Sie) die Beschreibung kritisch lesen.

Struktur: Ich habe ein FragmentPagerAdapter (Code unten), das zwei Fragmente gleichzeitig enthält. Der erste zeigt Buchauszüge und der zweite eine Liste von Buchtiteln.

Ziel: Ich möchte erreichen, was im Titel beschrieben wird: Der Benutzer kann zum zweiten Fragment im Pager navigieren, auf einen Titel klicken und dann den Benutzer zurück zu verschieben das erste Fragment und sagen Sie dem ersten Fragment, den Text zu aktualisieren. Das erste Fragment hat eine triggerRefresh -Methode dafür.

Code: Ich glaube, dass mein Problem dadurch entsteht, dass FragmentPagerAdapter die Fragmente wiederverwendet / erzeugt (was ich nicht verstehe). Das ist meine Klasse:

%Vor%

So habe ich die relevanten Mitglieder erstellt:

%Vor%

Und das habe ich an anderer Stelle in meiner Activity versucht, als ich den Rückruf aus dem Buchtitel Fragment mit dem Titel erhalten habe:

%Vor%

Reihe von Problemen:

Das Aufrufen des getView() des Adapters funktioniert nicht, weil es eine neue Instanz von ExcerptsFragment zurückgibt, die nicht die aktuell angehängte ist (wie erwartet, löst die Ausnahme aus).

Ich habe viele Leute hier gesehen ( Beispiel ), die nur Fragmente in getView() gespeichert haben. Ist das richtig? Denn wenn ich mir die offiziellen Beispiele anschaue, scheint es für mich ein Anti-Muster zu sein (besiege die automatische Referenz, indem du die Items hältst). Und das ist auch die Meinung hier und hier (und sieht genau zu mir).

Irgendwelche Vorschläge? Ich wäre nicht überrascht, wenn ich all dieses ein bisschen nicht verstehe ...

    
davidcesarino 05.04.2012, 03:10
quelle

3 Antworten

7

Haftungsausschluss: Auch wenn dies für mich schon ganz gut geklappt hat, sollten Sie sich der klassischen Fallstricke bewusst sein, abhängig von internem, privatem Verhalten . Während ich Tests schrieb, die mich schließlich warnen würden, wenn sich die interne Implementierung änderte, bin ich seitdem zu grüneren Weiden übergegangen. Und du solltest es auch. Daher ist der Wert dieser Frage und ihrer Antwort meiner Meinung nach nur historisch.

Tut mir leid wegen dieser Frage, ich denke es war die Stunde.

Um dieses Problem zu lösen, implementierte ich diese Lösung . Scheint gut zu funktionieren. Also glaube ich, dass es nur darum ging, die (momentan angehängte) Fragment-Instanz zu finden, indem ich herausfinde, wie ihre Id benannt ist. Der Link oben erklärt, wie es gemacht wird.

Ich habe mich entschieden, meine eigene Frage zu beantworten, anstatt sie zu löschen, weil ich glaube, dass Anfänger wie ich auf diesen Pagern von einem "echten Fall" profitieren werden. Die meisten Antworten, die ich gesehen habe, sprechen am meisten über die Theorie, was übrigens der richtige Weg ist ... aber ohne ein echtes Beispiel, an dem man arbeiten kann, gehen Leute wie ich manchmal verloren.

Wie auch immer, hier ist der letzte Teil des Codes, den ich brauchte (der kommentierte Teil oben):

%Vor%

Ich habe also das Gefühl, dass dies eine robuste Lösung ist, weil ich keine Referenzen zu Fragmenten hege (und riskiere, dass die Referenzen veraltet sind). Ich habe meinen eigenen Code auf ein Minimum beschränkt und damit die Chancen minimiert, dass ich etwas Dummes mache.

Natürlich, wenn Sie etwas hinzufügen möchten, um uns zu zeigen, was falsch ist, oder was verbessert werden kann, werde ich mich freuen, von Ihnen zu hören.

    
davidcesarino 05.04.2012, 04:23
quelle
2

Ich suchte selbst eine Lösung für dieses Problem. Ihr Ansatz funktioniert im Prinzip, aber er wird Ihren Code zerstören, wenn sich der Code der Fragment-Tag-Erstellung in der Android-Basisklassen-Implementierung ändert. Das ist eine ziemlich unangenehme Abhängigkeit!

Ein eleganterer Ansatz wäre, das Problem umzukehren und eine Instanz Ihrer Basisaktivität in Ihrem Fragment zu behalten. Implementieren Sie einen Setter für das Tag in Ihrer Aktivität und rufen Sie dieses bei der Erstellung innerhalb des Fragments auf - das Tag dort ist einfach mit getTag () verfügbar.

Eine Beispielimplementierung finden Sie hier .

    
Felix Böhmer 07.09.2013 14:10
quelle
0

Ich löste dieses Problem, indem ich bei der Erstellung schwacheReferenzen zu den Fragmenten verwendete. Siehe: Ссылка

Wenn Sie etwas falsch mit diesem Ansatz finden, kommentieren Sie bitte.

    
personne3000 24.05.2014 10:16
quelle