Ich brauche eine Lösung für die Pager-Implementierung. Erstens lade ich riesige Daten von der Datenbank in einzelne Seite, so manchmal während des Swipe verlangsamt die Wischfrequenz (Sie müssen mehrere Zeit Swipe auf der Seite), wie im Hintergrund, es macht Aufgabe zu holen. Ich verwende keine asynchrone Aufgabe zum Zurückgeben der Ansicht. Gibt es eine Möglichkeit, Seiten lazy zu laden, lassen Sie den Benutzer einfach auf andere Seite auf Swipe gehen, aber Daten ist faul geladen.
Mein Codebeispiel ist wie folgt:
%Vor%Ich rufe dies bei create method an.
%Vor%Gibt es eine Lösung?
Ich würde vorschlagen, mit Fragmenten zu arbeiten (und nicht direkt mit Ansichten).
Sie benötigen eine Schnittstelle auf Ihren Fragmenten, um ihnen mitzuteilen, wann sie angezeigt werden:
%Vor%Aktivieren Sie alle Ihre Fragmente, um diese Schnittstelle zu implementieren, und rufen Sie in dieser Methode Ihre Loader / asyncTasks / Hintergrundaufgaben auf.
Fügen Sie dann einen onPageChangeListener auf Ihrem ViewPager ein. Wenn Sie feststellen, dass der Benutzer die Seite geändert hat, rufen Sie die Schnittstellenmethode für Ihr Fragment auf. Sie haben bei diesem Listener einige Möglichkeiten, mit einer der Methoden zu warten, bis der viewPager aufhört zu rutschen, um den Interface-Aufruf auszulösen.
Um das richtige Fragment für diesen Aufruf zu erhalten, nehmen Sie das Fragment von yourFragmentApadter.instantiateItem (ViewGroup, int), das das Fragment für diese Position zurückgibt, wenn es bereits geladen ist.
%Vor%So können Sie Ihre Fragmente mit leeren Ansichten vorbereiten und wenn Sie auf eine davon gleiten, beginnen Sie mit dem Laden der Daten.
Ich habe gerade eine sehr ähnliche Aufgabe erledigt. Um die Lösung Ihres Problems zu finden, sollten Sie folgende Punkte beachten:
CursorLoader
s verwenden, die schwere Aufgaben wie das asynchrone Abrufen von Datenbanken ausführen. Dieses Tutorial zu den Interwebs stellt den ContentProvider Android-Ansatz vor. Am besten machen Sie sich mit der offiziellen Android URI- und ContentProvider-Dokumentation vertraut, wenn diese Begriffe nicht viel bedeuten. FragmentStatePagerAdapter
anstelle der traditionellen FragmentPagerAdapter
an. Ich habe diesen Adapter nicht benutzt, aber ich habe gelesen, dass er nur das gerade sichtbare Fragment instanziiert, d. H. Nicht die Fragmente rechts oder links von der aktuell ausgewählten Registerkarte. instantiateItem
wird aufgerufen, wenn ViewPager
gerade ausgetauscht wird und eine Ansicht benötigt. Es hat nicht um wirklich alles zu erstellen. Ich denke, letztendlich ist Lazy-Loading out. So wie ich es sehe, gibt es zwei Dinge, die du hier tun musst.
1: Zwischenspeichern Sie die Daten im Hintergrund, wenn der Benutzer Ihre Seite erreichen möchte. Ihr Beispiel behauptet, dass 364 Seiten (guter Gott), so würde ich sagen, verwenden Sie einen Listener, um Seitenänderungen zu behandeln. Wenn Sie auf Seite 363 sind, beginnen Sie mit dem Laden der Daten für 364. Wenn Sie bei 364 sind, laden Sie die Daten bei 365 und behalten Sie die Daten bei 363 für den Fall, dass der Benutzer zurück tauschen möchte. Wenn die Daten relativ schnell geladen werden oder der Benutzer eine lange Zeit für den Austausch benötigt, sollte dies kein Problem sein, wenn Sie asyncTask oder einen Thread zum Laden der Daten verwenden.
2: Verfügen über eine Standardbackupansicht, die erst beim Abrufen der Daten ausgefüllt wird. Sie müssen dies auch mit Option 1 tun, wenn der Benutzer die Seite lädt, bevor Sie die Daten abrufen. Im Grunde, haben Sie einfach eine Ansicht, die sagt "loading ..." oder etwas, bis Sie die Daten haben. Entweder das, oder füllen Sie die Daten in Echtzeit, wie Sie es bekommen. In diesem Fall sieht der Benutzer das Build.
Wie auch immer, ich denke, Sie müssen etwas zwischenspeichern, damit die App gut aussieht.
Ich hatte ein ähnliches Problem. Ein Viewpager, der schwere Daten geladen hat. Wenn Sie die Ansichten der einzelnen Seiten nicht häufig ändern, würde ich vorschlagen, dass Sie die Seiten im Speicher behalten. Verwenden Sie den folgenden Code, um dies durchzuführen
%Vor%Wenn Sie Daten auf den ViewPager-Folien aktualisieren möchten, verwenden Sie
%Vor%Und benutze FragmentStatePagerAdapter.
Ich glaube nicht, dass es eine Möglichkeit gibt, Daten auf die von Ihnen beschriebene synchrone Art zu laden. AsyncTask ist der Weg zu gehen oder vielleicht könnten Sie Threads direkt verwenden. Ich glaube, dass AsyncTask speziell für diese Art von Funktionalität entwickelt wurde. Es ist einfacher, den Thread dann direkt zu verwenden. Wenn Sie Ideen zur Implementierung benötigen, werfen Sie einen Blick auf: Ссылка
Haben Sie sich in android ignition library umgeschaut? nach Sample-Anwendungen gibt es eine Komponente "Endless List" und eine http-Cache-Komponente.
Ich habe es selbst nicht versucht und weiß nicht, ob das eine Lösung für dich ist - hab nur die Beispiele gesehen .....
Tags und Links android android-asynctask android-viewpager