No estoy familiarizado con FragmentPagerAdapter
, por lo que esta será una de esas preguntas en las que (usted) leerá la descripción críticamente.FragmentPagerAdapter con ViewPager y dos fragmentos. Vaya al primero del segundo y actualice el texto del primer
Estructura: Tengo un FragmentPagerAdapter
(código debajo), 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 nuevo al primer fragmento y dile 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 manera 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);
}
}
}
esto es cómo 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 tratado en otra parte de mi actividad, cuando recibo la llamada de retorno de los títulos de los libros 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 adaptador getView()
no funcionará porque devolverá una nueva instancia de ExcerptsFragment
, que no es la que está actualmente adjunta (como se esperaba, arroja la excepción).
He visto a mucha gente aquí (example) simplemente 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 here y here (y me parece a mí).
¿Alguna sugerencia? No me sorprendería si no entendiera todo esto ...
no debe confiar en la compatibilidad con el mecanismo interno de asignación de etiquetas. Vea mi respuesta a una pregunta similar sobre cómo hacer esto correctamente: http://stackoverflow.com/questions/14035090/how-to-get-existing-fragments-when-using-fragmentpageradapter/41345283#41345283 – morgwai
@morgwai Gracias por la advertencia yo. Incluí un descargo de responsabilidad para advertir a los lectores potenciales. – davidcesarino
de nada :) Sin embargo, creo que sería mejor proporcionar un enlace directamente a mi respuesta (no solo a esa pregunta) ya que mi respuesta es muy nueva y por lo tanto aún baja, así que los lectores pueden quedarse con uno de los 2 primeros respuestas puntuadas, ambas tienen problemas. (Agregué alguna explicación a mi respuesta por qué la solución que anula 'instanciateItem' puede no ser suficiente por sí misma) – morgwai