Android ViewPager不支持';调用setAdapter时不总是刷新,FragmentStatePagerAdapter

Android ViewPager不支持';调用setAdapter时不总是刷新,FragmentStatePagerAdapter,android,adapter,android-viewpager,Android,Adapter,Android Viewpager,首先,我使用FragmentStatePagerAdapter向ViewPager提供要显示的片段 当应用程序处于运行状态时(即在onResume()之后),在ViewPager上调用setAdapter将始终有效并使我的ViewPager刷新,适配器中的getItem(int位置)方法将被调用 但是,在方向更改之后,如果我在活动的onCreate(Bundle savedInstance)方法中调用setAdapter,则不会调用getItem(int position)方法,并且会重用旧片段

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

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

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

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


谢谢

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

尝试改用
getChildFragmentManager()

CustomFragmentPagerAdapter fragmentPagerAdapter = new CustomFragmentPagerAdapter(getChildFragmentManager());

答案找到了。

好吧,这是我发现的事情(非常奇怪)

如果您需要刷新
PagerAdapter
中的项,那么当您传递相同的
FragmentManager
并将它们传递给
ViewPager
setAdapter
调用时,您肯定无法刷新
PageAdapter
,例如:

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

但是,如果在初始化
PagerAdapter
时不断切换
FragmentManager
s,那么它就会工作


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

我使用FragmentPagerAdapter和mViewPager。setAdapter()不起作用。我在以下步骤中修复它:
(1) 获取当前片段列表。

List<Fragment> fragmentList = getSupportFragmentManager().getFragments();
List<Fragment> fragmentListCopy = new ArrayList<Fragment>(fragmentList);
(3) 将新FragmentPagerAdapter设置为ViewPager

mViewPager.setAdapter(...)

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

问题在于SavedState。我有同样的问题,但没有解决办法。您可以尝试以下操作:在设置适配器call adapter.saveState之前,请先将适配器和调用restoreSavedState设置为保存状态。对我来说没什么帮助,但也许对你有帮助。原因:在ViewPager setAdapter中,它保存了当前状态并重新使用。(我想)在这里找到正确答案:这会导致内存泄漏吗?很多人说确实如此。还有其他解决方案如何处理这种情况吗?是的!看这个答案真棒,谢谢你的回答。终于解决了…谢谢节省我的时间。。!
//I have two fragment
getSupportFragmentManager().beginTransaction().remove(fragmentList.get(0)).commit();
getSupportFragmentManager().beginTransaction().remove(fragmentList.get(1)).commit();
mViewPager.setAdapter(...)