Ho un problema con riferimento miei frammenti all'interno di un ViewPager. Mi piacerebbe farlo perché dalla mia attività mi piacerebbe aggiornare un frammento in una posizione specificata (ad esempio frammento attualmente visualizzato).Frammenti Riferimenti a all'interno ViewPager
Attualmente ho qualcosa di simile:
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);
}
}
Il problema è che il destroyItem()
viene chiamato più spesso di quanto getItem()
, quindi sono lasciati con riferimenti nulli. Se non utilizzo destroyItem()
per cancellare i riferimenti ai frammenti distrutti ... beh, faccio riferimento a frammenti che non esistono.
C'è un bel modo per fare riferimento a frammenti che vengono creati con EventListFragment mFragment = EventListFragment.newInstance(dateOffset);
? O cosa devo fare per aggiornare un frammento all'interno di un ViewPager dalla mia attività (dal menu delle opzioni per essere precisi)?
Ho appena finito le mie finali e ho deciso di tornare e vedere se le cose funzionavano ... felice di essere stato in grado di aiutare (anche se non era il problema principale: P). –
Domanda: la chiamata a fragList.remove() non deve essere passata al riferimento debole, piuttosto che al frammento? – gcl1
@ Michael: Ho iniziato a utilizzare un approccio come questo, e funziona piuttosto bene. Ma dal momento che il fragList contiene riferimenti deboli, sembra che le voci siano soggette alla garbage collection, anche se potrebbero comunque averne bisogno. Ho visto che il metodo getFragmentByPosition() a volte restituisce null, quindi penso che sia quello che sta succedendo. Qualche idea su come aggirare questo? Grazie. – gcl1