Referencia de fragmentos dentro de ViewPager

Tengo un problema con referenciar mis Fragmentos dentro de un ViewPager. Me gustaría hacerlo porque de mi actividad me gustaría actualizar un fragmento en una posición especificada (por ejemplo, fragmento que se muestra actualmente).

Actualmente tengo algo como esto:

public static class MyPagerAdapter extends FragmentPagerAdapter { private static final String TAG = "MyPagerAdapter"; private static HashMap<Integer, EventListFragment> mPageReferenceMap = new HashMap<Integer, EventListFragment>(); public MyPagerAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return NUM_ITEMS; } @Override public Fragment getItem(int position) { Log.i(TAG, "getItem: "+position); int dateOffset = position-1; EventListFragment mFragment = EventListFragment.newInstance(dateOffset); mPageReferenceMap.put(position, mFragment); return mFragment; } @Override public void destroyItem(ViewGroup container, int position, Object object) { Log.i(TAG, "destroyItem: "+position); mPageReferenceMap.remove(position); super.destroyItem(container, position, object); } public EventListFragment getFragment(int key) { Log.i(TAG, "Size of pager references: "+mPageReferenceMap.size()); return mPageReferenceMap.get(key); } } 

El problema es que el destroyItem() se llama con más frecuencia que getItem() , así que me quedan con referencias nulas. Si no utilizo destroyItem() para borrar referencias a fragmentos destruidos … bueno, hago referencia a fragmentos que no existen.

¿Hay alguna manera agradable de referencia a los fragmentos que se crean con EventListFragment mFragment = EventListFragment.newInstance(dateOffset); ? ¿O qué debo hacer para actualizar un fragmento dentro de un ViewPager desde mi actividad (desde el menú de opciones para ser preciso)?

Me las arreglé para solucionarlo. El truco era hacer una lista de referencia dentro de la actividad, no PagerAdapter. Dice así:

 List<WeakReference<EventListFragment>> fragList = new ArrayList<WeakReference<EventListFragment>>(); @Override public void onAttachFragment (Fragment fragment) { Log.i(TAG, "onAttachFragment: "+fragment); if(fragment.getClass()==EventListFragment.class){ fragList.add(new WeakReference<EventListFragment>((EventListFragment)fragment)); } } public EventListFragment getFragmentByPosition(int position) { EventListFragment ret = null; for(WeakReference<EventListFragment> ref : fragList) { EventListFragment f = ref.get(); if(f != null) { if(f.getPosition()==position){ ret = f; } } else { //delete from list fragList.remove(f); } } return ret; } 

Por supuesto, su fragmento tiene que implementar una función getPosition() , pero yo necesitaba algo como esto de todos modos, por lo que no era un problema.

Gracias Alex Lockwood por su sugerencia con WeakReference !

Dos cosas:

  1. Agregue la siguiente línea en el método onCreate su actividad (o dondequiera que inicialice su ViewPager):

     mPager.setOffscreenPageLimit(NUM_ITEMS-1); 

    Esto mantendrá las páginas fuera de pantalla adicionales en memoria (es decir, evitando que se destruyan), incluso cuando no se muestren en la pantalla.

  2. Podrías considerar la implementación de tu HashMap modo que contenga WeakReference<Fragment> s en lugar de los propios Fragment . Tenga en cuenta que esto requeriría que cambias tu método getFragment siguiente manera:

     WeakReference<Fragment> weakRef = mPageReferenceMap.get(position); return (weakRef != null) ? weakRef.get() : null; 

    Esto no tiene nada que ver con su problema … es sólo algo que me di cuenta y pensé que traería a su atención. Mantener las WeakReferences a su Fragment le permitirá aprovechar la capacidad del recolector de basura para determinar la accesibilidad para usted, por lo que no tiene que hacerlo usted mismo.

  • Dynamic Center Aligned ViewPager
  • ¿Cómo pasar una variable de Actividad a Fragmento y devolverla?
  • Cómo escribir una aplicación multi-panel de Android con navegación muy profunda
  • Cómo llamar a getFragmentManager en Recycler.Adapter?
  • Alternativa para el onResume () durante la conmutación de fragmentos
  • Android DialogFragment desaparece después del cambio de orientación
  • Error al inflar el fragmento de clase - id / illegalargumentexception duplicado?
  • Llamar fragmento de un adaptador de lista
  • Java.lang.IllegalStateException: No se puede cambiar la etiqueta del fragmento
  • Android libvlc problemas de superficie múltiples
  • Fragmentos onResume de la pila trasera
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.