Red de conocimiento informático - Material del sitio web - Cómo actualizar y reemplazar Fragment en ViewPager

Cómo actualizar y reemplazar Fragment en ViewPager

Cómo funciona ListView

Antes de comprender cómo funciona ViewPager, revisemos cómo funciona ListView:

ListView solo muestra ciertos elementos de la lista cuando es necesario mostrarlos. se aplicará a los objetos de vista disponibles; si crea objetos de vista para todos los datos de los elementos de la lista, desperdiciará memoria;

¿A quién busca ListView para solicitar objetos de vista? La respuesta es adaptador. El adaptador es un objeto controlador que es responsable de obtener datos de la capa del modelo, crear y completar los objetos de vista necesarios y devolver los objetos de vista preparados a ListView;

Primero, llamando al método getCount( ), ListView pregunta cuántos objetos están incluidos en la lista de la matriz (para evitar errores fuera de límites de la matriz, luego ListView llama al método getView(int, View, ViewGroup) del adaptador);

ViewPager es similar a ListView hasta cierto punto. La diferencia es que ListView llena la vista a través de ArrayAdapter.getView(int position, View convertView, ViewGroup parent) genera la posición especificada a través de FragmentPagerAdapter.getItem(int); posición).

A lo que debemos prestar atención es:

¿Cómo funcionan juntos ViewPager y su adaptador?

Declaración: El contenido de este artículo es para android.support.v4.app.*

ViewPager tiene dos adaptadores: FragmentPagerAdapter y FragmentStatePagerAdapter:

android. support.v4 .app.FragmentPagerAdapter

Hereda de android.support.v4.view.PagerAdapter Cada página es un Fragmento y todas las instancias de Fragmento siempre se guardan en el administrador de Fragmentos

. . Por lo tanto, es adecuado para una pequeña cantidad de fragmentos fijos, como un conjunto de etiquetas para visualización paginada. Excepto que cuando el Fragmento es invisible, su capa de vista (vista

jerarquía) puede destruirse, el Fragmento de cada página se guardará en la memoria. (Traducido de la sección de comentarios del archivo de código)

android.support.v4.app.FragmentStatePagerAdapter

Heredado de android.support.v4.view.PagerAdapter, cada página es un Fragmento, cuando el Fragmento ya no es necesario (por ejemplo, invisible), se destruirá todo el Fragmento, excepto el estado guardado

(el paquete guardado se usa para restaurar la instancia del Fragmento). Entonces funciona bien para muchas páginas.

(Traducido de la sección de comentarios del archivo de código)

Sus subclases deben implementar getItem(int) y android.support.v4.view.PagerAdapter.getCount().

Primero comprenda el uso típico de ViewPager y FragmentPagerAdapter a través de un fragmento de código

Análisis detallado más adelante:

// Configure un PagerAdapter para proporcionar vistas para este buscapersonas.

ViewPager viewPager = (ViewPager) findViewById(R.id.my_viewpager_id);

viewPager.setAdapter(mMyFragmentPagerAdapter);

FragmentPagerAdapter privado mMyFragmentPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {

@Override

public int getCount() {

return 2; // Devuelve el número de vistas disponibles.

}

@Override

public Fragment getItem(int position) {

return new MyFragment(); // Devuelve el fragmento asociado con una posición específica.

}

// Se llama cuando la vista del host intenta determinar si la posición de un elemento ha cambiado.

@Override

public int getItemPosition(Objeto objeto ) {

if (objeto instancia de MyFragment) {

((MyFragment)object).updateView()

}

return; super.getItemPosition(object);

}

};

clase privada MyFragment extiende Fragment {

@Override

public void onCreate(Bundle saveInstanceState) {

super.onCreate(savedInstanceState);

// hacer algo como datos de inicio

}

@Anular<

/p>

Vista pública onCreateView(LayoutInflater inflador, contenedor ViewGroup, paquete saveInstanceState) {

Vista vista = inflador.inflate(R.layout.fragment_my, contenedor, false);

// iniciar vista en el fragmento

devolver vista;

}

public void updateView() {

// hacer algo para actualizar el fragmento

}

}

FragmentPagerAdapter y FragmentStatePagerAdapter administran Fragment de manera ligeramente diferente. Antes de examinar la diferencia entre los dos en detalle, repasamos el. dos Una forma más intuitiva de sentirlo primero:

Compare intuitivamente las diferencias entre FragmentPagerAdapter y FragmentStatePagerAdapter a través de dos imágenes

Nota: Estas dos imágenes son de la "Guía de programación autorizada de Android". La imagen original tiene 3 Fragmentos. Agregué 1 Fragmento y el método al que se transfirió.

Gestión de fragmentos de FragmentPagerAdapter:

Gestión de fragmentos de FragmentStatePageAdapter:

Análisis detallado de la situación de llamada del método del adaptador y del método del ciclo de vida del fragmento

Bien, la experiencia ha terminado, necesitamos explorar los detalles y resolver el proceso de creación del adaptador y destrucción de Fragmentos durante el proceso, qué método de adaptador y método de ciclo de vida de fragmento se llaman, cuáles son iguales y cuáles. son diferentes.

Cuando está inicialmente en la página 0, el adaptador no solo crea una instancia de Fragmento para la página 0, sino que también crea una instancia de Fragmento para la página adyacente 1:

// En el comenzando en la página0

D/Adapter (25946): getItem(0)

D/Fragment0(25946): newInstance(2015-09-10) // Nota: newInstance() Llame al método constructor de Fragment, lo mismo a continuación.

D/Adaptador (25946): getItem(1)

D/Fragment1(25946): newInstance(Hola mundo, soy li2.)

D/Fragment0(25946): onAttach()

D/Fragment0(25946): onCreate()

D/Fragment0(25946): onCreateView()

D/Fragment1(25946): onAttach()

D/Fragment1(25946): onCreate()

D/Fragment1(25946): onCreateView()

La primera vez que se deslice de la página 0 a la página 1, el adaptador también creará una instancia de Fragmento para la página adyacente 2;

// La primera vez que se deslice a la página1

D/Adaptador (25946): onPageSelected(1)

D/Adaptador (25946): getItem(2)

D/Fragment2(25946): nuevaInstancia(verdadero)

D/Fragment2(25946): onAttach()

D/Fragment2(25946): onCreate()

D/Fragment2(25946): onCreateView()

FragmentPagerAdapter y FragmentStatePagerAdapter dijeron al unísono: Ahora, tenga la seguridad, mi señor, de que mis subordinados definitivamente prepararán la vista de la siguiente página adyacente para usted. ¡wah!

Ambos tienen la misma actitud hacia la página siguiente, pero hacen cosas diferentes para la página anterior:

FragmentPagerAdapter dijo: Instancia de la página anterior Aún se conserva, pero es la vista se destruye:

// Por enésima vez (N no es igual a 1), deslícese hacia la derecha para seleccionar la página2

D/Adapter (25946): onPageSelected( 2)

D/Adapter (25946): destroyItem(0) // Destruye la vista de la página0

D/Fragment0(25946): onDestroyView()

D/ Fragment3(25946): onCreateView() // La instancia de Fragment de la página3 todavía está guardada en FragmentManager, así que simplemente cree su vista

FragmentStatePagerAdapter dijo: La instancia y la vista de la página anterior han sido destruidas por mí La:

// Por enésima vez (N no es igual a 1), deslícese hacia la derecha para seleccionar la página2

D/Adapter (27880): onPageSelected(2)

D/Adapter (27880): destroyItem(0) // Destruye la instancia y vista de la página0

D/Adapter (27880): getItem(3) // Crea el fragmento de la página3

D/Fragment3(27880): newInstance()

D/Fragment0(27880): onDestroyView()<

/p>

D/Fragment0(27880): onDestroy()

D/Fragment0(27880): onDetach()

D/Fragment3(27880): onAttach()

D/Fragment3(27880): onCreate()

D/Fragment3(27880): onCreateView()