41

我正在编写一个使用 FragmentPagerAdapter 的应用程序。适配器中的片段需要根据外部数据进行更新——但这不会发生。我注意到片段类只在 getItem 函数中实例化一次:

@Override
public Fragment getItem(int position) {
    TabInfo info = mTabs.get(position);
    return Fragment.instantiate(mContext, info.clss.getName(),
                info.args);
}

即使我删除了这个类并使用了一个新的类,也没有任何帮助——这个方法只被调用一次,第一次填充选项卡,然后再也不会。任何人都知道为什么?

谢谢!

4

3 回答 3

53

每当适配器需要一个片段并且该片段不存在时,都会调用 getItem。

如果 FragmentManager 中已经存在该片段,则无需实例化它,也无需调用 getItem。

要更新现有片段,您需要从 FragmentManager 或适配器检索它并相应地对其进行操作。

默认情况下,viewpager 将为可见页面及其旁边的页面创建片段。即从位置 1 和 2 的片段开始。当您滑动到第 2 页时,将创建位置 3 的片段等

于 2013-10-12T21:46:58.233 回答
19

为了比上面的答案更具体(这是正确的!),getItem 由 FragmentPagerAdapter 的 instantiateItem(ViewGroup container, int position) 方法调用。以防万一有帮助:)

于 2014-03-12T20:20:39.120 回答
4

只需使用FragmentStatePagerAdapter而不是FragmentPagerAdapter

FragmentStatePagerAdapter 销毁不需要的片段实例并按需再次实例化。另一方面, FragmentPagerAdapter 只是分离 Fragment 并重新附加它。所以在 FragmentPagerAdapter 中创建的片段永远不会被破坏。这就是为什么我总是更喜欢 FragmentStatePagerAdapter。

于 2016-06-20T13:33:54.660 回答