调用setAdapter时,ViewPager并不总是刷新,FragmentStatePagerAdapter

时间:2012-11-26 00:31:43

标签: android adapter android-viewpager

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

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

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

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

由于

3 个答案:

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

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