Diferencia entre FragmentPagerAdapter y FragmentStatePagerAdapter
¿Cuál es la diferencia entre FragmentPagerAdapter
y FragmentStatePagerAdapter
?
Acerca de FragmentPagerAdapter
La guía de Google dice:
- Quitar todos los fragmentos de ViewPager poblados por FragmentStatePagerAdapter
- Cómo agregar la página dinámicamente en FragmentStatePagerAdapter
- Android FragmentStatePagerAdapter devuelve pantalla en blanco al recargar fragmentos de medio
- FragmentStatePageAdapter: Múltiples elementos visibles al mismo tiempo - ¿Cómo centrar una página específica?
- Android - fragmento de niño no carga la segunda vez dentro de FragmentStatePagerAdapter
Esta versión del buscapersonas es la mejor para usar cuando hay un puñado de fragmentos típicamente más estáticos para ser paginado a través de, como un conjunto de pestañas. El fragmento de cada página que visita el usuario se guardará en la memoria, aunque su jerarquía de vista se puede destruir cuando no esté visible. Esto puede resultar en el uso de una cantidad significativa de memoria ya que las instancias de fragmentos pueden mantenerse en una cantidad arbitraria de estado. Para conjuntos más grandes de páginas, considere FragmentStatePagerAdapter.
Y sobre FragmentStatePagerAdapter
:
Esta versión del buscapersonas es más útil cuando hay un gran número de páginas, trabajando más como una vista de lista. Cuando las páginas no son visibles para el usuario, su fragmento entero puede ser destruido, sólo manteniendo el estado guardado de ese fragmento. Esto permite que el buscapersonas mantenga la memoria mucho menos asociada con cada página visitada en comparación con FragmentPagerAdapter a costa de potencialmente más sobrecarga al cambiar entre páginas.
Así que sólo tengo 3 fragmentos. Pero todos ellos son un módulo separado con gran cantidad de datos. Fragment1
maneja algunos datos (que el usuario ingresa) ya través de la actividad pasa a Fragment2
, que es simplemente ListFragment
simple. Fragment3
también es ListFragment
.
Así que mis preguntas son : ¿Qué adaptador debo utilizar? FragmentPagerAdapter
o FragmentStatePagerAdapter
?
Agradecería mucho su ayuda. Alex. PS Lo siento por mi inglés 🙂
- Fragmentos que no se vuelven a crear por FragmentStatePagerAdapter después de volver a la instancia de Fragmento principal
- Android setUserVisibleHint nunca se llama?
- ListFragment no vuelve a mostrar datos al llamar desde FragmentStatePagerAdapter
- ViewPager con diferentes adaptadores para retrato y paisaje
- Ver Pager Crash Null Pointer Excepción debido a navegar de nuevo al fragmento antiguo - Android
- Después de la rotación, la transacción de fragmentos da IllegalStateException
- FragmentStatePagerAdapter fuga de memoria (fragmentos anidados con viewpager)
- Salta dinámicamente páginas en ViewPager
Como dicen los docs, piénsalo de esta manera. Si usted fuera a hacer una aplicación como un lector de libros, no querrá cargar todos los fragmentos en la memoria a la vez. Desea cargar y destruir Fragments
mientras el usuario lee. En este caso, utilizará FragmentStatePagerAdapter
. Si sólo está mostrando 3 "pestañas" que no contienen una gran cantidad de datos pesados (como Bitmaps
), entonces FragmentPagerAdapter
podría adaptarse bien. Además, tenga en cuenta que ViewPager
por defecto 3 fragmentos en la memoria. El primer Adapter
que mencionas podría destruir la jerarquía View
y volver a cargarlo cuando sea necesario, el segundo Adapter
sólo guarda el estado del Fragment
y lo destruye por completo, si el usuario vuelve a esa página, se recupera el estado.
-
FragmentPagerAdapter
almacena todo el fragmento en la memoria, y podría aumentar una sobrecarga de memoria si una gran cantidad de fragmentos se utilizan enViewPager
. -
En contrario su hermano,
FragmentStatePagerAdapter
sólo almacena el savedInstanceState de fragmentos, y destruye todos los fragmentos cuando pierden el foco. -
Por lo tanto
FragmentStatePagerAdapter
debe utilizarse cuando tenemos que utilizar fragmentos dinámicos, como fragmentos con widgets, ya que sus datos podrían ser almacenados en elsavedInstanceState
.savedInstanceState
afectará el rendimiento, incluso si hay gran número de fragmentos. -
En contrario, su hermano
FragmentPagerAdapter
debe utilizarse cuando necesitamos almacenar el fragmento completo en la memoria. -
Cuando digo que todo el fragmento se guarda en la memoria, significa que sus instancias no serán destruidas y crearían una sobrecarga de memoria. Por lo tanto, se aconseja utilizar
FragmentPagerAdapter
sólo cuando hay un número bajo de fragmentos paraViewPager
. -
Sería incluso mejor si los fragmentos son estáticos, ya que no tendrían gran cantidad de objetos cuyas instancias se almacenarían.
Para ser más detallado,
FragmentStatePagerAdapter:
-
Con
FragmentStatePagerAdapter
, el fragmento innecesario se destruye. Una transacción se compromete a eliminar completamente el fragmento del FragmentManager de su actividad. -
El estado en
FragmentStatePagerAdapter
proviene del hecho de que salvará elBundle
de fragmento desavedInstanceState
cuando se destruye. Cuando el usuario navega de nuevo, el nuevo fragmento se restaurará utilizando el estado del fragmento.
FragmentPagerAdapter:
-
Por comparación
FragmentPagerAdapter
no hace nada del tipo. Cuando el fragmento ya no es necesario.FragmentPagerAdapter
llama adetach(Fragment)
en la transacción en lugar deremove(Fragment)
. -
Esto destruye la vista del fragmento pero deja la instancia del fragmento viva en el
FragmentManager
los fragmentos creados en elFragmentPagerAdapter
nunca se destruyen.
Algo que no se dice explícitamente en la documentación o en las respuestas de esta página (aunque implícito por @Naruto), es que FragmentPagerAdapter
no actualizará los Fragmentos si los datos del fragmento cambian porque mantiene el fragmento en la memoria.
Por lo tanto, incluso si tiene un número limitado de fragmentos para mostrar, si desea poder actualizar sus fragmentos (por ejemplo, vuelva a ejecutar la consulta para actualizar el listView en el fragmento), debe utilizar FragmentStatePagerAdapter.
Mi punto entero aquí es que el número de fragmentos y si son o no son similares no es siempre el aspecto dominante a considerar. Si sus fragmentos son dinámicos también es clave.
FragmentPagerAdapter
almacena los datos anteriores que se obtienen del adaptador mientras que FragmentStatePagerAdapter
toma el nuevo valor del adaptador cada vez que se ejecuta.
FragmentStatePagerAdapter = Para acomodar un gran número de fragmentos en ViewPager. Dado que este adaptador destruye el fragmento cuando no es visible para el usuario y sólo savedInstanceState del fragmento se mantiene para uso posterior. De esta manera se utiliza una pequeña cantidad de memoria y se obtiene un mejor rendimiento en caso de fragmentos dinámicos.
FragmentPageAdapter se utiliza de la misma manera que FragmentStatePagerAdapter . La principal diferencia es cómo descarga sus fragmentos cuando ya no son necesarios.
Con FragmentStatePagerAdapter , su fragmento innecesario se destruye. Se compromete una transacción a quitar completamente el fragmento del FragmentManager de su actividad. El "estado" en FragmentStatePagerAdapter proviene del hecho de que salvará el paquete de fragmento de onSaveInstanceState (Bundle) cuando se destruye. Cuando el usuario navega de nuevo, el nuevo fragmento se restaurará utilizando esa instancia.
FragmentPagerAdapter maneja las cosas de manera diferente. Cuando su fragmento ya no es necesario, FragmentPagerAdapter llama a separar (Fragmento) en la transacción, en lugar de quitar (Fragmento) . Esto destruye la vista del fragmento, pero deja la instancia de fragmento viva en el FragmentManager . Por lo tanto, los fragmentos creados por FragmentPagerAdapter nunca se destruyen.
- La creación y ejecución de aplicaciones a través de Gradle y Android Studio es más lenta que a través de Eclipse
- Ciclo de vida de la actividad de Android: ¿para qué sirven todos estos métodos?