Referencing Fragments inside ViewPager

android, android-fragments

Solution

I managed to solve it. The trick was to make a reference list inside Activity, not PagerAdapter. It goes like this:

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;

}

Of course your fragment has to implement a `getPosition()` function, but I needed something like this anyway, so it wasn't a problem.

Thanks Alex Lockwood for your suggestion with `WeakReference`!

Problem

I have a problem with referencing my Fragments inside a ViewPager. I would like to do it because from my activity I'd like to refresh a fragment at a specified position (e.g. currently displayed fragment). Currently I have something like this: ``` 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); } } ``` The problem is that the `destroyItem()` gets called more often than `getItem()`, so I'm left with null references. If I don't use `destroyItem()` to clear references to destroyed fragments... well I reference fragments that don't exist. Is there any nice way to reference fragments that are created with `EventListFragment mFragment = EventListFragment.newInstance(dateOffset);`? Or what should I do to refresh a fragment inside a ViewPager from my activity (from options menu to be precise)?

Original source