gpt4 book ai didi

android - 在 ViewPager 中引用 fragment

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:48 27 4
gpt4 key购买 nike

我在 ViewPager 中引用我的 fragment 时遇到问题。我想这样做是因为从我的 Activity 中我想刷新指定位置的 fragment (例如当前显示的 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() 来清除对已销毁 fragment 的引用...那么我引用了不存在的 fragment 。

有什么好方法可以引用使用 EventListFragment mFragment = EventListFragment.newInstance(dateOffset); 创建的 fragment ?或者我应该怎么做才能从我的 Activity (准确地说是从选项菜单)刷新 ViewPager 内的 fragment ?

最佳答案

我设法解决了它。诀窍是在 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;

}

当然,您的 fragment 必须实现 getPosition() 函数,但无论如何我都需要这样的东西,所以这不是问题。

感谢 Alex Lockwood 对 WeakReference 的建议!

关于android - 在 ViewPager 中引用 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10574114/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com