7

首先,我使用 FragmentStatePagerAdapter 为 ViewPager 提供要显示的片段。

当应用程序处于运行状态时(即之后onResume()),在 ViewPager 上调用 setAdapter 将始终有效并使我的 ViewPager 刷新,getItem(int position)调用适配器中的方法。

onCreate(Bundle savedInstance)但是,在方向更改之后,如果我在我的活动的方法中调用 setAdapter,getItem(int position)则不会调用该方法,而是重用旧片段。

我在想也许 FragmentManager 正在做一些我不明白的事情?片段管理器是唯一不会在方向更改期间被破坏的东西。

谢谢

4

3 回答 3

23

这可能是因为您getFragmentManager()在使用嵌套片段时用于实例化 FragmentStatePagerAdapter。

尝试getChildFragmentManager()改用:

CustomFragmentPagerAdapter fragmentPagerAdapter = new CustomFragmentPagerAdapter(getChildFragmentManager());

在这里找到了答案。

于 2014-01-23T16:53:06.833 回答
1

好吧,这就是我发现的东西(这非常奇怪)。

如果您需要刷新项目,PagerAdapter那么您肯定会失败创建新实例,PageAdapter当您传递相同FragmentManager并将它们传递给的setAdapter调用时ViewPager,例如:

FragmentManager fm = getChildFragmentManager();
mViewPager.setAdapter(new MyPagerAdapter(fm));

或者

FragmentManager fm = getActivity().getSupportFragmentManager();
mViewPager.setAdapter(new MyPagerAdapter(fm));

FragmentManager但是,如果您在初始化时不断切换s ,PagerAdapter那么它将起作用。

从我的角度来看,这太可怕了......如果有人知道如何ViewPager正确刷新项目(而不是以这种肮脏的方式),请与他人分享您的想法:)

于 2015-03-30T12:12:40.383 回答
0

我使用 FragmentPagerAdapter 并且 mViewPager.setAdapter() 不起作用。我在下面的步骤中修复它:
(1)获取当前的 Fragment 列表。

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(...)

只需在设置新适配器之前删除片段。

于 2016-06-28T07:17:18.427 回答