Impedisci a ViewPager di distruggere le visualizzazioni fuori schermo


133

Ho un ViewPager collegato a un FragmentPagerAdapter che mostra tre frammenti. Il ViewPager sembra distruggere la vista di un frammento ospitato quando è a più di un colpo di distanza dalla posizione corrente.

Queste visualizzazioni sono tutti semplici elenchi e questa ottimizzazione è completamente inutile, quindi vorrei disabilitarlo. Sta causando alcuni problemi visivi perché agli elenchi sono state applicate animazioni di layout e tali animazioni vengono riprodotte dopo essere state distrutte e ricreate. Mostra anche l'animazione di introduzione della barra di scorrimento ogni volta (in cui la barra di scorrimento è brevemente visibile per indicare che lo scorrimento è possibile) che può essere fonte di distrazione e la posizione di scorrimento corrente dell'utente viene persa nel processo.

Inoltre, non carica il terzo frammento fino a quando non si verifica il primo colpo, il che è problematico perché ogni frammento gestisce le proprie chiamate di servizio e preferirei che tutti e tre gli spengono allo stesso tempo quando viene caricata l'attività. Avere la terza chiamata di servizio in ritardo non è l'ideale.

C'è un modo per convincere ViewPager a fermare questo comportamento e mantenere tutti i miei frammenti in memoria?

Risposte:


332

Nella revisione 4 del pacchetto di supporto, è stato aggiunto un metodo a ViewPager che consente di specificare il numero di pagine fuori schermo da utilizzare, anziché il valore predefinito che è 1.

Nel tuo caso, vuoi specificare 2, in modo che quando ti trovi nella terza pagina, la prima non venga distrutta e viceversa.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);

qualche idea su come farlo su una coverflow?
josephus,

4
Ciao. In quello su cui sto lavorando, i frammenti / le pagine vengono creati dinamicamente, quindi c'è un numero indefinito di probabili frammenti. In questo caso, di solito va a 10 o meno. Non sarebbe uno scarso uso della memoria utilizzare questa soluzione per così tante pagine? A proposito, i frammenti manterranno la vista. Grazie!
Mahkie,

Questo metodo genera: "java.lang.IllegalStateException: Frammento già aggiunto:" errore per la mia app.
alicanbatur,

Molte grazie. Ha funzionato davvero. Anch'io ho avuto lo stesso problema come @chefgon.
Prashant,

@mahie le soluzioni di cui sopra se per Questo è offerto come ottimizzazione. Se si conosce in anticipo il numero * di pagine che sarà necessario supportare o disporre di meccanismi di caricamento lazy in atto * sulle proprie pagine, la modifica di questa impostazione può avere vantaggi nella scorrevolezza percepita * delle animazioni e dell'interazione del paging. Se hai un piccolo numero di pagine (3-4) * che puoi mantenere attive tutte in una volta, meno tempo sarà speso nel layout per *
sottotitoli

8

Per impostazione predefinita, ViewPager ricrea i frammenti quando si scorre la pagina. Per evitare ciò, puoi provare una delle due cose:

1. In onCreate () dei tuoi frammenti, chiama setRetainInstance (true).

2. Se il numero di frammenti è fisso e relativamente piccolo, nel tuo onCreate () aggiungi il seguente codice:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);

Se ricordo bene, la seconda opzione è più promettente. Ma ti esorto a provare entrambi e vedere quali funzionano.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.