Mic*_*ł K 9 android android-fragments
我在ViewPager中引用我的片段时遇到问题.我想这样做是因为从我的活动中我想要在指定位置刷新片段(例如当前显示的片段).
目前我有这样的事情:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是destroyItem()被调用的次数多于getItem(),所以我留下了空引用.如果我不使用destroyItem()清除对已销毁片段的引用...那么我引用不存在的片段.
有没有很好的方法来引用用它创建的片段EventListFragment mFragment = EventListFragment.newInstance(dateOffset);?或者我该如何从我的活动中刷新ViewPager中的片段(从选项菜单中精确)?
我设法解决了它.诀窍是在Activity中创建一个引用列表,而不是PagerAdapter.它是这样的:
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;
}
Run Code Online (Sandbox Code Playgroud)
当然你的片段必须实现一个getPosition()函数,但无论如何我需要这样的东西,所以这不是问题.
感谢Alex Lockwood的建议WeakReference!
| 归档时间: |
|
| 查看次数: |
6174 次 |
| 最近记录: |