Android FragmentStatePagerAdapter

Estoy trabajando con un FragmentStatePagerAdapter usando este ejemplo .

La clase MyAdapter se implementa de la siguiente manera:

public static class MyAdapter extends FragmentStatePagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return NUM_ITEMS; } @Override public Fragment getItem(int position) { return ArrayListFragment.newInstance(position); } } 

La clase ListFragment incluye el siguiente método para crear una nueva instancia:

  /** * Create a new instance of CountingFragment, providing "num" * as an argument. */ static ArrayListFragment newInstance(int num) { ArrayListFragment f = new ArrayListFragment(); // Supply num input as an argument. Bundle args = new Bundle(); args.putInt("num", num); f.setArguments(args); return f; } 

Cuando creo un nuevo adaptador de paginador de estado de fragmento en mi actividad, se llama getItem , que a su vez llama al método newInstance en la clase ListFragment. Esto es genial cuando quiero crear un nuevo fragmento.

Pero no está claro para mí cómo modificar getItem (si es necesario) para obtener el objeto fragmento cuando ya existe y las páginas de usuario de, por ejemplo, la página 2 a la página 1. Me gustaría que mi actividad para recuperar que existente, Fragmento creado previamente para que pueda ejecutar una clase interna AsyncMethod , que reside en la clase de fragmento.

5 Solutions collect form web for “Android FragmentStatePagerAdapter”

He implementado algo similar a lo que tienes. He extendido la clase FragmentPagerAdapter así:

 public class ContactsFragmentPagerAdapter extends FragmentPagerAdapter { ActionBar mActionBar; private List<Fragment> mFragments; public ContactsFragmentPagerAdapter(FragmentManager fm, List<Fragment> fragments) { super(fm); mFragments = fragments; } @Override public int getCount() { return mFragments.size(); } @Override public Fragment getItem(int position) { return mFragments.get(position); } public void setActionBar(ActionBar bar) { mActionBar = bar; } } 

Tenga en cuenta que he añadido un argumento al constructor para pasar en la List de objetos de Fragment . De esta manera, el método getItem() de esta clase puede devolver cualquier clase que extienda Fragment o cualquiera de sus subclases y no sólo una clase específica ArrayListFragment como lo ha hecho.

En la Activity donde instancio mi subclase de FragmentPagerAdapter he pasado en la lista de objetos de Fragment :

Class la instancia del FragmentPagerAdapter

 public final class ContactManager extends Activity { private ContactsFragmentPagerAdapter mAdapter; private ViewPager mPager; public ActionBar mActionBar; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.contact_manager); List<Fragment> fragments = new Vector<Fragment>(); fragments.add(Fragment.instantiate(this, ContactsListFragment.class.getName())); fragments.add(Fragment.instantiate(this, GroupsListFragment.class.getName())); mAdapter = new ContactsFragmentPagerAdapter(this.getFragmentManager(), fragments); mPager = (ViewPager) findViewById(R.id.pager); mPager.setAdapter(mAdapter); mPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageScrollStateChanged(int arg0) {} @Override public void onPageScrolled(int arg0, float arg1, int arg2) {} @Override public void onPageSelected(int arg0) { mActionBar.getTabAt(arg0).select(); } }); } } 

Al acceder a la variable "fragmentos", puede acceder a un Fragment creado previamente para que pueda ejecutar métodos de ese Fragment .

Creo que la solución es mucho más simple que las respuestas proporcionadas.

Si echa un vistazo a la fuente de FragmentStatePagerAdapter.instantiateItem() , notará que instantiateItem() maneja esta lógica para usted, y por lo tanto su implementación de getItem() siempre debe devolver una nueva instancia.

Así que para devolver un Fragmento existente, simplemente haz (asumiendo que estás llamando desde ViewPager ):

 Fragment f = (Fragment) getAdapter().instantiateItem(this, getCurrentItem()); 

Mientras que la solución de @ imiric es muy concisa, todavía me molesta que requiera conocimiento de la implementación de la clase. Mi solución implica agregar lo siguiente a su adaptador, que debe comportarse bien con un FragmentStatePagerAdapter posiblemente destruyendo fragmentos:

  private SparseArray<WeakReference<Fragment>> mFragments = new SparseArray<>(); @Override public Object instantiateItem(ViewGroup container, int position) { Fragment f = (Fragment) super.instantiateItem(container, position); mFragments.put(position, new WeakReference<>(f)); // Remember what fragment was in position return f; } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); mFragments.remove(position); } public Fragment getFragment(int position) { WeakReference<Fragment> ref = mFragments.get(position); Fragment f = ref != null ? ref.get() : null; if (f == null) { Log.d(TAG, "fragment for " + position + " is null!"); } return f; } 
 public class MyPagerAdapter extends FragmentStatePagerAdapter { final Context m_context; final WeakReference<Fragment>[] m_fragments; public DetailPagerAdapter(FragmentManager fm) { super(fm); m_context = ... m_fragments = new WeakReference[enter size here]; } @Override public Fragment getItem(int position) { final Fragment fragment = instantiate your fragment; m_fragments[position] = new WeakReference<Fragment>(fragment); return fragment; } @Override public int getCount() { return ... } public Fragment getFragment(final int position) { return m_fragments[position] == null ? null : m_fragments[position].get(); } } 

No es necesario modificar el FragmentPagerAdapter, porque los fragmentos son almacenados en caché por el FragmentManager. Así que debe necesitar encontrar dentro de él. Utilice esta función para encontrar el fragmento mediante la posición del adaptador de buscapersonas.

 public Fragment findFragmentByPosition(int position) { FragmentPagerAdapter fragmentPagerAdapter = getFragmentPagerAdapter(); return getSupportFragmentManager().findFragmentByTag( "android:switcher:" + getViewPager().getId() + ":" + fragmentPagerAdapter.getItemId(position)); } 

Código de ejemplo para api de soporte v4.

  • FragmentPagerAdapter con ViewPager y dos Fragmentos. Ir a la primera de la segunda y actualizar el primer texto
  • Cómo hacer que PagerAdapter cargue todas las páginas
  • Desplazamiento no funciona en android ViewPager con FragmentPagerAdapter
  • Las variables de miembro de fragmento que obtienen null cuando se accede en onPageSelected ()
  • IllegalStateException: No se puede cambiar la etiqueta del fragmento era android: switcher ahora android: switcher
  • Implementación de MVP con Dagger en un FragmentPagerAdapter
  • Intentar invocar método virtual 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler ()' en una referencia de objeto nulo
  • Cómo hacer la transición de viewpager rápido con fragmento?
  • IllegalStateException: El PagerAdapter de la aplicación cambió el contenido del adaptador sin llamar a PagerAdapter # notifyDataSetChanged
  • ViewPager con fragmentos anidados?
  • Android: reutilizar fragmentos de ViewPager y FragmentPagerAdapter
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.