Evitar que ViewPager destruya vistas fuera de la pantalla

133

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.

Estas vistas son todas 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 han sido destruidas y recreadas. También muestra la animación de introducción de la barra de desplazamiento cada vez (donde la barra de desplazamiento es brevemente visible para indicar que es posible el desplazamiento) 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 preferiría que los tres se apaguen al mismo tiempo cuando se carga la actividad. Tener la tercera llamada de servicio retrasada es menos que ideal.

¿Hay alguna forma de convencer a ViewPager para que detenga este comportamiento y simplemente mantenga todos mis fragmentos en la memoria?

chefgon
fuente

Respuestas:

332

En la revisión 4 del Paquete de soporte, se agregó un método a ViewPager que le permite especificar el número de páginas fuera de pantalla que se utilizarán, en lugar del valor predeterminado, que es 1.

En su caso, desea especificar 2, de modo que cuando se encuentre en la tercera página, la primera no se destruya, y viceversa.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
David Snabel-Caunt
fuente
¿Alguna idea de cómo hacer esto en un coverflow?
Joseph
44
Hola. En lo que estoy trabajando, los fragmentos / páginas se crean dinámicamente, por lo que hay un número indefinido de fragmentos probables. En este caso, generalmente va a 10 o menos. ¿No sería un mal uso de la memoria usar esta solución para tantas páginas? Los fragmentos solo mantendrán la vista, por cierto. ¡Gracias!
mahkie
Este método arroja: "java.lang.IllegalStateException: Fragment ya agregado:" error para mi aplicación.
alicanbatur
Muchas gracias. Realmente funcionó. Yo también tuve el mismo problema como @chefgon.
Prashant
@mahie las soluciones anteriores si para esto se ofrece como una optimización. Si conoce de antemano el número * de páginas que necesitará admitir o tener mecanismos de carga diferida * en sus páginas, ajustar esta configuración puede tener beneficios en la suavidad percibida * de las animaciones de paginación y la interacción. Si tiene un pequeño número de páginas (3-4) * que puede mantener activas todas a la vez, se dedicará menos tiempo al diseño de * subárboles de vista recién creados a medida que las páginas de usuario
van
8

De forma predeterminada, ViewPager recrea los fragmentos cuando desliza la página. Para evitar esto, puede probar una de dos cosas:

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

2. Si el número de fragmentos es fijo y relativamente pequeño, entonces 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 prometedora. Pero le insto a que pruebe ambos y vea cuál de ellos funciona.

Pankaj Talaviya
fuente