Mam problem z odwoływaniem się do moich fragmentów wewnątrz ViewPager. Chciałbym to zrobić, ponieważ z mojej działalności chciałbym odświeżyć fragment w określonej pozycji (np. Aktualnie wyświetlany fragment).Odwoływanie się do Fragmenty wewnątrz ViewPager
Obecnie mam coś takiego:
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);
}
}
Problem polega na tym, że destroyItem()
jest wywoływana częściej niż getItem()
, więc pozostaje mi referencji null. Jeśli nie używam destroyItem()
do usuwania odniesień do zniszczonych fragmentów ... cóż, odwołuję się do fragmentów, które nie istnieją.
Czy istnieje jakiś dobry sposób odniesienia fragmentów, które są tworzone z EventListFragment mFragment = EventListFragment.newInstance(dateOffset);
? Albo co zrobić, aby odświeżyć fragment wewnątrz ViewPagera z mojej aktywności (z menu opcji, by być precyzyjnym)?
Właśnie skończyłem moje finały i postanowiłem wrócić i zobaczyć, czy masz działające rzeczy ... cieszę się, że mogłem pomóc (nawet jeśli nie było to z głównym problemem: P). –
Pytanie: czy nie powinno się przekazywać wywołania fragList.remove() słabego odwołania, a nie fragmentu? – gcl1
@Michael: Zacząłem używać takiego podejścia i działa całkiem nieźle. Ale ponieważ fragList zawiera słabe referencje, wydaje się, że wpisy podlegają wyrzucaniu śmieci, nawet jeśli nadal ich potrzebujesz. Widziałem, że metoda getFragmentByPosition() czasami zwraca wartość null, więc myślę, że to właśnie się dzieje. Jakieś pomysły, jak sobie z tym poradzić? Dzięki. – gcl1