2012-04-05 13 views
9

Wir versuchen, eine Android-Anwendung zu erstellen, die auf ViewPager basiert und während der Laufzeit Anweisungen zum Hinzufügen und Entfernen von Seiten erhält. Fast wie bei einem Browser mit Registerkarten können Sie den aktuellen Tab entfernen oder einen bestimmten Tab entfernen.Seiten auf ViewPager und FragmentStatePagerAdapter löschen

Nach Google-Dokumentation wir FragmentStatePagerAdapter verwenden, wird das bestimmt in Situationen verwendet werden, wenn eine große Anzahl von Seiten gibt es mehr wie eine Listenansicht arbeiten.

Aber wenn wir versuchen, zu: - eine Seite entfernen, die nicht auf dem Bildschirm ist - und ein neues Fragment-Objekt aus der gleichen Klasse - und auf die gleiche Position auf der Seite entfernt bemerkten wir, dass der Android Plattform die tote Seite wiederherstellen und diese dem Benutzer anzeigen. Das neue Objekt, das wir gerade erstellt haben, führt einfach nicht "onCreate", "onCreateView" oder "onActivityCreated" aus.

Wir suchen nach Möglichkeiten, um dieses Problem zu beheben, um die Plattform zu zwingen aus der gleichen Klasse Objekt unseres neuen Fragments zu verwenden. Irgendwelche Ideen?

Wir fanden heraus, dass, wenn wir die aktuelle Seite die Plattform in der Tat die Seite und erstellt aus der gleichen Klasse ein neues Objekt zerstört zerstören. Hier ist ein kleines Beispiel, das das Problem und dieses Verhalten repliziert.

Quelle: http://dl.dropbox.com/u/8333012/SimpleAdapter/SimplePager.zip

Video: http://www.youtube.com/watch?v=-oaXXwU8PSI&hd=1

Von diesem Projekt, wenn Sie die Textview auf der ersten Seite berühren es entworfen wurde, um die zweite Seite zu entfernen (was grün ist) auf eine neue blaue Seite. Sie werden sehen, dass die zweite Seite auch dann grün bleibt, wenn Sie das von der ersten Seite an tun. Wenn Sie jedoch auf der zweiten Seite (grün) auf die Schaltfläche "Zurück" tippen und die Textansicht berühren, wird die zweite Seite mit der richtigen blauen Farbe angezeigt.

Antwort

13

Wenn Sie sich mit ListViews beschäftigen und die zugrunde liegenden Daten Ihres Adapters ändern, rufen Sie notifyDataSetChanged() auf und jede View, die den Datensatz widerspiegelt, wird aktualisiert. Das ist die Art, wie Sie mit Fragment Pager Adapter auch gehen sollten.

In Ihrem Fall benachrichtigen Sie den Adapter nicht. Im Fall von FragmentPagerAdapter/FragmentStatePagerAdapter macht dies jedoch keinen Unterschied, da diese Adapter "notifyDataSetChanged()" standardmäßig ignorieren. Damit es funktioniert die getItemPosition() in Ihrem Adapter Implementierung

@Override 
public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 

Und wie schon gesagt außer Kraft setzen, nachdem Sie hinzufügen/entfernen Fragmente nennen (in Ihrem showOtherPage())

mAdapter.notifyDataSetChanged(); 
+1

Vielen Dank, aber als Nebenwirkung des Leistung zum Seitenwechsel stark verringert. Wie 2 Sekunden, um Seiten auf dem Galaxy Tab 10'1 (Google I/O-Ereignis) zu ändern. Vor deinem Vorschlag war es augenblicklich. –

+0

Danke, du sparst meine Zeit! – ihrupin

Verwandte Themen