【问题标题】:ViewPager doesn't always refresh when setAdapter is called, FragmentStatePagerAdapter调用 setAdapter 时 ViewPager 并不总是刷新,FragmentStatePagerAdapter
【发布时间】:2012-11-26 00:31:43
【问题描述】:

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

当应用处于运行状态时(即在onResume()之后),在ViewPager上调用setAdapter总是会起作用并使我的ViewPager刷新,适配器中的getItem(int position)方法被调用。

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

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

谢谢

【问题讨论】:

  • 问题是 SavedState。我有同样的问题,但没有解决方案。您可以尝试以下操作:在设置适配器之前调用 adapter.saveState,然后设置适配器并使用保存的状态调用 restoreSavedState。就我而言,它没有帮助,但也许对你有用。原因:在 ViewPager setAdapter 中它保存了当前状态并重用它。 (我认为)
  • 在这里找到正确答案:stackoverflow.com/questions/13910826/…
  • 这会导致内存泄漏吗?许多人说确实如此。任何其他解决方案如何处理这种情况?
  • 太棒了,感谢您的回复。终于解决了。。

标签: android adapter android-viewpager


【解决方案1】:

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

尝试改用getChildFragmentManager()

CustomFragmentPagerAdapter fragmentPagerAdapter = new CustomFragmentPagerAdapter(getChildFragmentManager());

已找到答案here

【讨论】:

  • 谢谢节省我的时间..!
【解决方案2】:

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

如果您需要刷新 PagerAdapter 中的项目,当您传递相同的FragmentManager 并将它们传递给@ 时,您肯定会失败创建PageAdapter 的新实例987654324@拨打ViewPager,例如:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      相关资源
      最近更新 更多