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

Sobre FragmentPagerAdapter de Google guía dice:

Esta versión del paginador es mejor para su uso cuando hay un puñado de
por lo general, más estática fragmentos ser paginado a través de una serie de
las pestañas. El fragmento de cada página que el usuario visita se mantendrá en
la memoria, a pesar de que su punto de vista de la jerarquía pueden ser destruidos cuando no visible.
Esto puede resultar en el uso de una cantidad significativa de memoria desde fragmento
las instancias pueden aferrarse a una cantidad arbitraria de estado. Para grandes conjuntos
de páginas, considere la posibilidad de FragmentStatePagerAdapter.

Y sobre FragmentStatePagerAdapter:

Esta versión del paginador es más útil cuando hay un gran número de
de páginas, trabajando más como una vista de lista. Cuando las páginas no son visibles para
el usuario, su todo el fragmento puede ser destruido, solo en el mantenimiento de la
estado guardado de ese fragmento. Esto permite que el busca mantener mucho
menos de la memoria asociado con cada página visitada en comparación a
FragmentPagerAdapter en el costo de los potencialmente más arriba cuando el
para cambiar entre las páginas.

Así que tengo solo 3 fragmentos. Pero todos ellos son módulos independientes con una gran cantidad de datos.

Fragment1 maneja algunos datos (que los usuarios entrar) y pasa a través de la actividad en Fragment2, que es sólo un simple ListFragment. Fragment3 es también un ListFragment.

Así que mis preguntas son: Que adaptador debo usar? FragmentPagerAdapter o FragmentStatePagerAdapter?

  • Creo que tienen sólo 3 Fragmentos, usted califica para el uso FragmentPagerAdapter. Las fichas de estos Fragmentos probablemente va a ser visibles simultáneamente.
  • este post guardado mi 5-6 horas, porque yo uso equivocado tipo de Adaptador
  • La respuesta a esta pregunta arroja una pregunta más stackoverflow.com/questions/9156406/…
InformationsquelleAutor AlexMomotov | 2013-09-11

6 Comentarios

  1. 282

    Como la documentación decir, pensar de esta manera. Si usted fuera a hacer una aplicación como un lector de libros, usted no desea cargar todos los fragmentos en memoria a la vez. Te gustaría carga y destruir Fragments como el usuario las lea. En este caso se va a utilizar FragmentStatePagerAdapter. Si usted apenas está mostrando 3 «pestañas» que no contienen una gran cantidad de datos pesados (como Bitmaps), entonces FragmentPagerAdapter puede adaptarse a usted bien. También, tenga en cuenta que ViewPager por defecto de carga de 3 fragmentos en la memoria. La primera Adapter se menciona que podría destruir View jerarquía y volver a cargar cuando sea necesario, la segunda Adapter sólo guarda el estado de la Fragment y destruye por completo, si el usuario vuelve a la página, el estado se recupera.

    • Tengo varios Botones y TextViews en Fragment1 y ListView que generan los elementos de forma dinámica en Fragment2 y Fragment3. ¿Crees que es una buena idea utilizar FragmentStatePagerAdapter y almacenar todos los datos de la Actividad, pasando a los Fragmentos a través de Paquete?
    • Vistas en el Fragmento, el diseño no tiene nada que ver con la elección de FragmentStatePagerAdapter. La pregunta aquí es la cantidad de Fragmentos que se hojeaba.
    • Así que básicamente no hay nada en favor de FragmentPagerAdapter a usarlo.
    • la ventaja de FragmentPagerAdapter es que la conmutación entre los fragmentos podrían ser mucho más rápido, como el real Fragment objetos no necesitan ser reconstruidas cada momento. Por otro lado, esto terminaría usando más memoria que contiene el fragmento de objetos en memoria.
    • Tengo 3 pestañas/pages (que cada muestra un WebView), por lo que se han utilizado FragmentPagerAdapter. Sin embargo, la última página todavía se pone a dibujar cuando me pase a través de él desde la primera página. Para solucionar esto, he utilizado viewPager.setOffscreenPageLimit(2).
    • sí, como Phan Van Linh ha escrito ya, al inicio de la actividad, usted tendrá sólo dos fragmentos creado. ¿Quiere usted decir que Fragment1 y Fragment3 se vuelve a dibujar en cada dedo para ellos?
    • Si recuerdo correctamente, sí, la última/primera de las tres fragmentos estaban siendo volverdibuja cada vez que se pase a ellos desde el primer/último fragmento, respectivamente.

  2. 122
    • FragmentPagerAdapter tiendas de todo el fragmento en la memoria, y podría
      aumentar la sobrecarga de la memoria de si una gran cantidad de fragmentos que se utilizan en
      ViewPager.

    • En contrario que su hermano, FragmentStatePagerAdapter sólo almacena la
      savedInstanceState de fragmentos, y destruye todos los fragmentos cuando
      se pierda el foco.

    • Por lo tanto FragmentStatePagerAdapter debe ser utilizado cuando tenemos que
      dinámica de fragmentos, como los fragmentos con los widgets, como sus datos
      podría ser almacenado en el savedInstanceState.También que no afectará el rendimiento, incluso si hay un gran número de
      los fragmentos.

    • En contrario que su hermano FragmentPagerAdapter debe ser utilizado cuando
      necesitamos almacenar todo el fragmento en la memoria.

    • Cuando digo todo el fragmento se mantiene en la memoria, es decir, su
      las instancias no será destruido y crearía una sobrecarga de memoria.
      Por lo tanto, se recomienda utilizar FragmentPagerAdapter sólo cuando no
      son baja en el número de fragmentos de ViewPager.

    • Sería aún mejor si los fragmentos son estáticas, ya que
      no tener gran cantidad de objetos cuyas instancias sería
      almacena.

    A ser más detalle,

    FragmentStatePagerAdapter:

    • con FragmentStatePagerAdapter,su innecesarios fragmento es
      destruida.Una transacción se ha comprometido a eliminar completamente el
      fragmento de su actividad FragmentManager.

    • El estado en FragmentStatePagerAdapter proviene del hecho de que
      va a guardar su fragmento del Bundle de savedInstanceState cuando
      es destruido.Cuando el usuario navega de regreso,el nuevo fragmento se
      restaurado con el fragmento del estado.

    FragmentPagerAdapter:

    • Por comparación FragmentPagerAdapter no hace nada de la clase.Cuando
      el fragmento no es necesario.FragmentPagerAdapter llamadas
      detach(Fragment) en la transacción en lugar de remove(Fragment).

    • Esta destruir el fragmento de la vista, pero deja el fragmento de la instancia
      vivo en la FragmentManager.así que los fragmentos creados en el
      FragmentPagerAdapter nunca se destruyen.

    • ¿Por qué tienes 2 respuestas?
    • ¿cuál es el beneficio de mantener la totalidad de los fragmentos en la memoria?
    • si el siguiente fragmento es ya instanciado (es decir, FragmentPagerAdapter), estará dispuesto a hacer cuando pase a ella, por lo que el pase de animación será más suave. Con FragmentStatePagerAdapter, el siguiente fragmento de instancia no puede existir hasta que te pase a ti, y si se trata de un fragmento grande que es costoso para crear, puede ver una repetición de la animación. Es una cuestión de rendimiento-consumo de memoria.
    • Madrigueras bcoz uno es AnswerText que es bueno para las pequeñas y estático de las respuestas y el otro es AnswerStateText que es para los más grandes y dinámicos respuestas
  3. 37

    Algo que no está dicho explícitamente en la documentación o en las respuestas en esta página (aunque implícita por @Naruto), es que FragmentPagerAdapter no actualización de los Fragmentos si los datos en el Fragmento de los cambios, ya que mantiene el Fragmento en la memoria.

    Por lo que incluso si usted tiene un número limitado de Fragmentos de la pantalla, si quieres ser capaces de actualizar sus fragmentos (digamos, por ejemplo, vuelva a ejecutar la consulta para la actualización del listView en el Fragmento), es necesario utilizar FragmentStatePagerAdapter.

    Mi punto aquí es que el número de Fragmentos y de si son o no similares no es siempre el aspecto clave a tener en cuenta. Si o no sus fragmentos son dinámicos también es clave.

    • Así que decir que tengo 2 fragmentos, 1 recyclerview en el fragmento de Una , cuando hago clic en un elemento que cambia el contenido del fragmento B, decir que fragB.setText(«blablabla»). Que debo usar el estado pagerthen ?
    • No es seguro, pero yo diría que sí. Acabo de probar ambos, es realmente fácil y rápido para cambiar el código de uno a otro, de todos modos.
    • Está usted seguro de que esto es correcto? Estoy usando FragmentPagerAdapter en mi actividad que utiliza un ViewPager a mostrar dos de los fragmentos – en el que cada fragmento contiene una lista. Mi primera lista que se llama «Todos los Informes» y el segundo de la lista es «Favorito de los Informes». En la primera lista, si me toca el icono de estrella para un informe, se actualiza la base de datos para cambiar el favorito de estado de ese informe. Luego me pase a través y he conseguido ver este informe en la interfaz de usuario de la segunda lista. Así que tal vez los casos se mantienen en la memoria, pero en algunos casos (por ejemplo, la mía) el contenido se actualiza realmente bien para FragmentPagerAdapter
  4. 35

    Aquí es un registro del ciclo de vida de cada uno de los fragmentos en ViewPager que tiene 4 fragmento y offscreenPageLimit = 1 (default value)

    FragmentStatePagerAdapter

    Ir a Fragment1 (actividad de lanzamiento)

    Fragment1: onCreateView
    Fragment1: onStart
    Fragment2: onCreateView
    Fragment2: onStart

    Ir a Fragment2

    Fragment3: onCreateView
    Fragment3: onStart

    Ir a Fragment3

    Fragment1: onStop
    Fragment1: onDestroyView
    Fragment1: onDestroy
    Fragment1: onDetach
    Fragment4: onCreateView
    Fragment4: onStart

    Ir a Fragment4

    Fragment2: onStop
    Fragment2: onDestroyView
    Fragment2: onDestroy

    FragmentPagerAdapter

    Ir a Fragment1 (actividad de lanzamiento)

    Fragment1: onCreateView
    Fragment1: onStart
    Fragment2: onCreateView
    Fragment2: onStart

    Ir a Fragment2

    Fragment3: onCreateView
    Fragment3: onStart

    Ir a Fragment3

    Fragment1: onStop
    Fragment1: onDestroyView
    Fragment4: onCreateView
    Fragment4: onStart

    Ir a Fragment4

    Fragment2: onStop
    Fragment2: onDestroyView

    Conclusión: FragmentStatePagerAdapter llamada onDestroy cuando el Fragmento es superar offscreenPageLimit mientras FragmentPagerAdapter no.

    Nota: yo creo que deberíamos usar FragmentStatePagerAdapter para un ViewPager que tiene un montón de página, porque es bueno para el rendimiento.

    Ejemplo de offscreenPageLimit:

    Si vamos a Fragment3, se se detroy Fragment1 (o Fragment5 si tiene) porque offscreenPageLimit = 1. Si ponemos offscreenPageLimit > 1 se no destruir.

    Si en este ejemplo, se establece offscreenPageLimit=4, no hay ninguna diferencia entre el uso de FragmentStatePagerAdapter o FragmentPagerAdapter porque Fragmento llamar nunca onDestroyView y onDestroy cuando cambiamos de pestaña

    Github demo aquí

  5. 14

    FragmentPagerAdapter almacena los datos anteriores, que se obtiene desde el adaptador mientras FragmentStatePagerAdapter toma el nuevo valor del adaptador de cada vez que se ejecuta.

  6. 4

    FragmentStatePagerAdapter = para dar cabida A un gran número de fragmentos en ViewPager. Como este adaptador destruye el fragmento cuando no es visible para el usuario y sólo savedInstanceState del fragmento se mantiene para su uso posterior. De esta manera una baja cantidad de memoria y un mejor desempeño en el caso de la dinámica de los fragmentos.

Dejar respuesta

Please enter your comment!
Please enter your name here