2011-12-01 7 views
101

Tengo un ViewPager conectado a un FragmentPagerAdapter que muestra tres fragmentos. El ViewPager parece destruir la vista de un fragmento alojado cuando está a más de un deslizamiento de la posición actual.Evitar que ViewPager destruya vistas fuera de pantalla

Estas vistas son listas simples y esta optimización es completamente innecesaria, por lo que me gustaría deshabilitarla. Está causando algunos problemas visuales porque las listas tienen animaciones de diseño aplicadas y esas animaciones se reproducen después de que se destruyeron y recrearon. También muestra la animación de introducción de barra de desplazamiento cada vez (donde la barra de desplazamiento es brevemente visible para indicar que es posible desplazarse) lo que puede distraer, y la posición de desplazamiento actual del usuario se pierde en el proceso.

Tampoco carga el tercer fragmento hasta que ocurre el primer deslizamiento, lo cual es problemático porque cada fragmento maneja sus propias llamadas de servicio y prefiero que los tres se apaguen al mismo tiempo cuando se carga la actividad. Tener la tercera llamada de servicio demorada es menos que ideal.

¿Hay alguna manera de convencer a ViewPager para detener este comportamiento y simplemente mantener todos mis fragmentos en la memoria?

Respuesta

277

En revision 4 del paquete de apoyo, se añadió un método para ViewPager que le permite especificar el número de páginas fuera de la pantalla para usar, en vez del predeterminado que es 1.

En su caso, se desea especificar 2, de modo que cuando estás en la tercera página, el primero no se destruye, y viceversa.

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

alguna idea de cómo hacer esto en un flujo de cobertura? – josephus

+4

Hola. En lo que estoy trabajando, los fragmentos/páginas se crean de forma dinámica, por lo que existe una cantidad indefinida de fragmentos probables. Este caso, por lo general va a 10 o menos. ¿No sería un mal uso de la memoria utilizar esta solución en tantas páginas? Los fragmentos solo sostendrán la vista, por cierto. ¡Gracias! – mahkie

+0

Este método arroja: "java.lang.IllegalStateException: Fragmento ya agregado:" error para mi aplicación. – alicanbatur

2

Por defecto, ViewPager recrea los fragmentos cuando pase la página. Para evitar esto, puede probar una de estas dos cosas:

1. En el onCreate() de sus fragmentos, llame a setRetainInstance (true).

2. Si el número de fragmentos se fija & relativamente pequeño, a continuación, en su onCreate(), agregue el siguiente código:

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

Si no recuerdo mal, la segunda opción es más prometedor. Pero le insto a probar ambos y ver cuál de ellos funciona.

+1

el segundo funciona para mí. –

Cuestiones relacionadas