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

首先,我使用FragmentStatePagerAdapter来提供一个ViewPager的片段来显示。

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

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

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

谢谢

  • 在Viewpager中映射v2 SupportMapFragment
  • ViewPager PagerObserver未注册
  • Android CoordinatorLayout + AppbarLayout + Viewpager总是滚动
  • 如何知道ViewPager已经在android中滚动了一半的屏幕
  • 屏幕方向更改后,从ViewPager的适配器中销毁项目
  • 查看寻呼机和片段生命周期
  • 如何解决viewpager:指定的孩子已经有一个父母。 您必须先调用子对象的父对象的removeView()
  • 修复圆形ViewPager的animation
  • 这可能是因为您正在使用getFragmentManager()在使用嵌套片段时实例化FragmentStatePagerAdapter。

    尝试使用getChildFragmentManager()来代替:

     CustomFragmentPagerAdapter fragmentPagerAdapter = new CustomFragmentPagerAdapter(getChildFragmentManager()); 

    答案在这里find。

    那么这是我发现的事情(这非常非常奇怪)。

    如果您需要刷新 PagerAdapter项目, PageAdapter当您传递相同的FragmentManager并将其传递给setAdapter调用时,您肯定无法创buildPageAdapter新实例,例如:

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

    要么

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

    但是,如果您在初始化PagerAdapter时不断切换FragmentManager ,那么它就可以工作。

    从我的angular度来看,这是可怕的…如果任何人有正确的ViewPager (而不是在这种肮脏的方式)刷新项目的想法,与其他人分享您的想法:)

    我使用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(...) 

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