with viewpager tutorial studio sectionspageradapter practice pageradapter fragments example best and android android-fragments android-viewpager updating fragmentpageradapter

android - tutorial - FragmentPagerAdapter con ViewPager y dos fragmentos. Vaya al primero del segundo y actualice el texto del primero



view pager adapter android studio (3)

No estoy familiarizado con FragmentPagerAdapter , así que esta va a ser una de esas preguntas en la que (usted) leerá la descripción de manera crítica.

Estructura: Tengo un FragmentPagerAdapter (código a continuación), que contendrá dos fragmentos a la vez. El primero muestra extractos de libros, y el segundo una lista de títulos de libros.

Objetivo: quiero lograr lo que se describe en el título: el usuario puede navegar hasta el segundo fragmento en el busca, hacer clic en un título, y luego quiero mover al usuario de vuelta al primer fragmento y decirle al primer fragmento que actualice el texto. El primer fragmento tiene un método triggerRefresh para eso.

Código: Creo que mi problema ocurre debido a la forma en que FragmentPagerAdapter reutiliza / crea los Fragmentos (que no entiendo). Esta es mi clase:

static class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return NUM_ITEMS; } @Override public Fragment getItem(int position) { switch(position) { case 0: return new ExcerptsFragment(); case 1: return new BookListFragment(); default: throw new IllegalArgumentException("not this many fragments: " + position); } } }

Así es como creé los miembros relevantes:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager); MyFragmentPagerAdapter mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); mViewPager.setAdapter(mFragmentPagerAdapter);

Y esto es lo que he intentado en otra parte de mi Actividad, cuando recibo la devolución de llamada de los títulos del libro Fragmento con el título seleccionado:

mViewPager.setCurrentItem(0); // back to excerpts screen page. It''s OK. // Here''s the problem! How to identify the fragment 0 // to ExcerptsFragment and call its triggerRefresh()?!?

Serie de problemas:

Llamar al getView() del adaptador no funcionará porque devolverá una nueva instancia de ExcerptsFragment , que no es la adjunta actualmente (como se esperaba, arroja la excepción).

He visto a mucha gente aquí ( ejemplo ) solo almacenando fragmentos en el getView() . ¿Está bien? Porque al mirar los ejemplos oficiales, me parece un antipatrón (derrota la referencia automática al mantener los elementos). Y esa es también la opinión aquí y aquí (y me parece correcta).

¿Alguna sugerencia? No me sorprendería si no entendiera todo esto un poco ...


Busqué una solución a este problema un rato yo mismo. En principio, su enfoque funciona, pero romperá su código si alguna vez cambia el código de creación de la etiqueta de fragmento en la implementación de la clase base de Android. ¡Esta es una dependencia bastante desagradable!

Un enfoque más elegante sería cambiar el problema y mantener una instancia de su actividad base en su fragmento. Implemente un setter para la etiqueta en su actividad y llámelo dentro del fragmento al momento de la creación, la etiqueta simplemente está disponible con getTag ().

Una implementación de ejemplo se puede encontrar aquí .


Descargo de responsabilidad: Aunque esto funcionó perfectamente bien para mí antes, debe ser consciente de las trampas clásicas de depender del comportamiento interno y privado . Mientras escribía exámenes que eventualmente me advertirían si la implementación interna cambiaba, desde entonces he pasado a pastos más verdes . Y tú deberías, también. Como tal, el valor de esta pregunta y su respuesta es solo histórica, en mi opinión.

Perdón por esa pregunta, creo que fue la hora.

Para resolver ese problema, implementé esta solución tal como está. Parece que funciona bien. Entonces, creo que solo fue cuestión de encontrar la instancia del fragmento (actualmente adjunta) al descubrir cómo se nombra su Id. El enlace de arriba explica cómo está hecho.

Opté por responder a mi propia pregunta en lugar de eliminarla porque creo que los novatos como yo en estos buscadores se beneficiarán de un "caso real". La mayoría de las respuestas que he visto hablan más acerca de la teoría, que es la manera correcta, por cierto ... pero sin un ejemplo real para trabajar, a veces la gente como yo se pierde.

De todos modos, aquí está la última pieza de código que necesitaba (la parte comentada arriba):

int n = 0; mViewPager.setCurrentItem(n); // in the question I had stopped here. ExcerptsFragment f = (ExcerptsFragment) ContainerActivity.this .getSupportFragmentManager().findFragmentByTag(getFragmentTag(n)); f.triggerRefresh(); // ... below the helper method: used the solution from the link. private String getFragmentTag(int pos){ return "android:switcher:"+R.id.pager+":"+pos; }

Por lo tanto, tengo la sensación de que esta es una solución robusta, porque no tengo referencias a fragmentos (arriesgándome a que las referencias estén desactualizadas). Mantuve mi propio código al mínimo, por lo tanto, minimizando las posibilidades de que haga algo estúpido.

Por supuesto, si tiene algo que agregar, mostrarnos, decir qué está mal al hacerlo o qué se puede mejorar, me alegraría saber de usted.


Resolví este problema usando WeakReferences para los fragmentos en la creación. Ver: https://.com/a/23843743/734151

Si encuentra algo incorrecto con este enfoque, coméntelo.