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 次  |  
        
|   最近记录:  |