【发布时间】:2014-05-12 08:38:07
【问题描述】:
我使用FragmentStatePagerAdapter 来在 ViewPager 中显示片段,所有这些片段都遵循相同的布局容器(FrameLayout),但它的数量在运行时是可变的,所以我把所有它们中的一个静态List片段并将该列表传递给FragmentStatePagerAdapter(第一次通过它的构造函数,之后每次我只更新列表和notifydatasetchanged):
public class MyPageAdapter extends FragmentStatePagerAdapter {
public static List<Fragment> myFragments = new ArrayList<Fragment>();
public MyPageAdapter(FragmentManager fragmentManager, List<Fragment> fragments) {
super(fragmentManager);
myFragments = fragments;
}
public Fragment getItem(int i) {
return myFragments.get(i);
}
@Override
public int getCount() {
return myFragments.size();
}
}
现在这是我在运行时创建Fragment List 的方式:
public List<Fragment> fragmenting(int num) { // num: the Number of fragments i wanna create
List<Fragment> fragments = new Vector<Fragment>();
for(int i =0; i < num ; i++){
Bundle page = new Bundle();
page.putInt("index", i);
fragments.add(Fragment.instantiate(mContext, MyFragment.class.getName(), page));
}
return fragments;
}
并提交新的片段到ViewPager:
public static PagerAdapter ad;
public static ViewPager sViewPager;
private static MyPageAdapter mpa;
public void display_fragments(int i, boolean init) {
if(init){ // init means we are in the first initialization and it goes here only at the first time
List<Fragment> fragments = fragmenting(i);
mpa = new MyPageAdapter(getChildFragmentManager(), fragments);
sViewPager = (ViewPager) view.findViewById(R.id.my_view_pager);
}else{ // is our case here
List<Fragment> fragments = fragmenting(i);
MyPageAdapter.myFragments = fragments;
mpa.notifyDataSetChanged();
}
ad = mpa;
sViewPager.setAdapter(ad);
sViewPager.setCurrentItem(0);
}
在这个阶段一切正常,如果我浏览指定数量的片段,它将有效地导航,每个片段都有MyFragment片段的容器。
但是当尝试访问片段的视图时,它仅根据前两个片段中的MyFragment返回指定的视图(FrameLayout),然后返回null ,我尝试通过循环mpa 打印出返回的视图:
for(int g =0; g < mpa.getCount(); g++){
System.out.println(mpa.getItem(g));
}
这就是我得到的:
05-12 08:36:10.175: I/System.out(1062): MyFragment{53535b8c #1 id=0x7f06005e}
05-12 08:36:10.175: I/System.out(1062): MyFragment{540e71b4 #0 id=0x7f06005e}
05-12 08:36:10.175: I/System.out(1062): MyFragment{540e7298}
05-12 08:36:10.175: I/System.out(1062): MyFragment{540e737c}
05-12 08:36:10.175: I/System.out(1062): MyFragment{540e7460}
【问题讨论】:
-
您尝试打印时在哪一页?如果片段不是
ViewPager中的当前可见页面(或可见页面左侧和右侧的页面),则片段的视图将被销毁。 -
@Luksprog 我在第一页,它包含所有其他片段
-
那么这是正常的,正如我上面所说的。适配器的构建是高效的,因此它会破坏用户无法立即访问的片段视图。你需要重新思考你的逻辑,你也做错了其他事情。
-
@Luksprog 根据您的信息,添加
sViewPager.setCurrentItem(g);时它必须工作,但它的行为也相同,以及您正在处理的其他事情是什么。您可以将所有这些都提供到答案中
标签: android android-fragments fragmentstatepageradapter