我有我引用片段内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
!