Das erste angezeigte Fragment von ViewPager ist mit FragmentStatePager immer falsch

8

Ich versuche, das gleiche view pager + tabs Design wie der PlayStore 5.1.x zu haben. Hier ist mein Layout:

%Vor%

Mein Adapter:

%Vor%

Meine Tabs und Pager werden korrekt angezeigt! aber ich habe bemerkt, dass das erste Fragment, das im View-Pager angezeigt wird, immer dasselbe ist wie das zweite. Dann, wenn ich einmal, zweimal wische und zurück zur ersten Seite wische, finde ich, dass das korrekte Fragment jetzt gezeigt wird !!

Ich kann nicht verstehen, warum dieses Verhalten, bitte ich brauche einige Erklärungen.

LÖSUNG

Das Problem war auf meine FakeFragment.newInstance() -Methodendefinition zurückzuführen.

%Vor%

Ich habe es geändert, indem ich eine setArguments(args) für meine FakeFragment -Instanz verwendet habe und sie dann in onCreate method abgerufen habe. Jetzt funktioniert alles gut!

Kann mir jemand erklären warum?

Ich denke, dass auf diese Weise der Wert der Position in hohem Maße vom Lebenszyklus des Fragments abhängt, also wird immer die erwartete Position sein.

    
S.Thiongane 27.12.2014, 22:47
quelle

2 Antworten

6

1) Implementieren Sie getItemPosition(Object) nicht, wenn Sie nicht damit umgehen. Sie sind nicht verpflichtet, es zu implementieren, und Sie könnten andere Funktionen durch falsche Implementierung brechen.

2) Der Punkt von getItem(int) ist, ein neues Fragment zurückzugeben. Ziehen Sie das Fragmentarray ab, da es keinen Sinn ergibt.

3) Machen Sie die Adpater-Klasse static (Es fördert die Wiederverwendbarkeit, der Adapter sollte nicht von der Elternklasse abhängen, um seine Datenmenge zu bekommen, oder?) und übergeben Sie die Category s als Konstruktorparameter. Speichern Sie es in einer Variablen und erstellen Sie neue Fragmente gemäß diesem Datensatz. Wahrscheinlich möchten Sie auch einen Category[position] als Parameter an den Fragmentkonstruktor übergeben und nicht nur an position .

    
Eugen Pechanec 01.01.2015 00:43
quelle
3

Die getItem() Implementierung ist das Problem.

%Vor%

Sie sollten niemals die Daten in dieser Methode ändern: Rufen Sie nicht add() auf. Ich bezweifle, dass die Adapter an dieser Stelle wissen würde, dass Sie ein Element hinzugefügt haben.

    
shkschneider 06.01.2015 15:11
quelle