里面ViewPager引用片段片段、里面、ViewPager

2023-09-05 23:51:41 作者:因为你丶守候记忆

我有我引用片段内ViewPager一个问题。我想这样做,因为从我的活动,我想刷新一个片段中的指定位置(例如当前显示的片段)。

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).

目前我有这样的事情:

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);
    }
}

的问题是, destroyItem()被调用往往比的getItem(),所以我只剩下空引用。如果我不使用 destroyItem()来明确提到了销毁片段......好吧我引用不存在的片段。

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.

有什么好方法引用了与 EventListFragment mFragment = EventListFragment.newInstance(dateOffset)创建的片段; ?或者,我应该怎么做才能刷新内部ViewPager片段从我的活动(从选项菜单为precise)?

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)?

推荐答案

我设法解决这个问题。诀窍是使内部活动的参考名单,不PagerAdapter。它是这样的:

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;

}

当然,你的片段具有实施为getPosition()的功能,但我需要这样的事情,无论如何,所以它不是一个问题。

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

感谢亚历克斯·洛克伍德的建议与的WeakReference

Thanks Alex Lockwood for your suggestion with WeakReference!