Diferencia entre FragmentPagerAdapter y FragmentStatePagerAdapter

¿Cuál es la diferencia entre FragmentPagerAdapter y FragmentStatePagerAdapter ?

Acerca de FragmentPagerAdapter La guía de Google dice:

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 🙂

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 en ViewPager .

  • 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 el savedInstanceState . 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 para ViewPager .

  • 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á el Bundle de fragmento de savedInstanceState 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 a detach(Fragment) en la transacción en lugar de remove(Fragment) .

  • Esto destruye la vista del fragmento pero deja la instancia del fragmento viva en el FragmentManager los fragmentos creados en el FragmentPagerAdapter 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.

  • GetResources de FragmentStatePagerAdapter
  • ¿Cómo evitar recrear Fragment en ViewPager?
  • Segundo conjunto de pestañas en un fragmento de Android
  • FragmentStatePagerAdapter no llamando a getItem
  • ViewPager primer fragmento mostrado siempre es incorrecto con FragmentStatePager
  • ViewPager no se actualiza con FragmentStatePagerAdapter
  • Android: intenta invocar el método virtual 'void android.support.v4.app.Fragment.setMenuVisibility (boolean)' en una referencia de objeto nulo
  • Cargar sólo un fragmento en ViewPager
  • ViewPager + FragmentStatePageAdapter: ¿qué significa esta advertencia "no actualizada en línea"?
  • El fragmento ya no existe para la clave f0: index 1
  • Desplazamiento Dirección en ViewPager
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.