首先,我使用FragmentStatePagerAdapter为ViewPager提供要显示的片段。
当app处于运行状态时(即onResume()
之后),在ViewPager上调用setAdapter将始终有效并刷新ViewPager,调用适配器中的getItem(int position)
方法。
然而,在更改方向后,如果我在活动的onCreate(Bundle savedInstance)
方法中调用setAdapter,则不会调用getItem(int position)
方法,并且会重用旧片段。
我想也许FragmentManager正在做一些我不理解的事情?片段管理器是在方向更改期间唯一不会被破坏的东西。
由于
答案 0 :(得分:23)
可能是因为您在使用嵌套片段时使用getFragmentManager()
来实例化FragmentStatePagerAdapter。
请尝试使用getChildFragmentManager()
:
CustomFragmentPagerAdapter fragmentPagerAdapter = new CustomFragmentPagerAdapter(getChildFragmentManager());
找到了答案here。
答案 1 :(得分:1)
这就是我发现的东西(它非常奇怪)。
如果您需要PagerAdapter
中的刷新项目,那么当您传递相同的PageAdapter
时,您肯定会无法创建FragmentManager
的新实例并将它们传递给setAdapter
的{{1}}调用,例如:
ViewPager
或
FragmentManager fm = getChildFragmentManager();
mViewPager.setAdapter(new MyPagerAdapter(fm));
但是,如果您在初始化FragmentManager fm = getActivity().getSupportFragmentManager();
mViewPager.setAdapter(new MyPagerAdapter(fm));
时不断切换FragmentManager
,那么它就可以正常工作。
从我的观点来看,这太糟糕了......如果有人想知道如何正确刷新PagerAdapter
中的项目(而不是这种肮脏的方式),请与他人分享您的想法:)< / p>
答案 2 :(得分:0)
我使用FragmentPagerAdapter并且mViewPager.setAdapter()不起作用。我在下面的步骤中修复它:
(1)获取当前的片段列表。
List<Fragment> fragmentList = getSupportFragmentManager().getFragments();
List<Fragment> fragmentListCopy = new ArrayList<Fragment>(fragmentList);
(2)移除片段
//I have two fragment
getSupportFragmentManager().beginTransaction().remove(fragmentList.get(0)).commit();
getSupportFragmentManager().beginTransaction().remove(fragmentList.get(1)).commit();
(3)将新的FragmentPagerAdapter设置为ViewPager
mViewPager.setAdapter(...)
在设置新适配器之前,只需删除片段。