FragmentPagerAdapter的getItem方法何时被调用?

41

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

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

即使我删除了这个类并使用一个新类,也没有帮助 - 这个方法只被调用一次,在选项卡第一次填充时,然后再也不会被调用。有人知道原因吗?

谢谢!

3个回答

53

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

如果片段已经存在于FragmentManager中,则无需实例化它,并且不需要调用getItem。

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

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


能否销毁一个 Fragment? - n00b programmer
2
https://dev59.com/IWkv5IYBdhLWcg3wtTK7 - Kuffs
http://stackoverflow.com/questions/15212309/cannot-remove-fragment-from-viewpager-why - Kuffs
在公共的Fragment getItem(int position)方法中,position是基于0的吗?@Kuffs - tgkprog
我认为是这样,但已经有一段时间没有看过了,所以可能是错误的。 - Kuffs
显示剩余4条评论

19
更具体地说,getItem方法是由FragmentPagerAdapter的instantiateItem(ViewGroup container, int position)方法调用的。以防有所帮助 :)

4

只需使用FragmentStatePagerAdapter替换FragmentPagerAdapter

FragmentStatePagerAdapter会在需要时销毁不需要的片段实例并重新实例化。另一方面,FragmentPagerAdapter仅分离片段并重新附加。因此,在FragmentPagerAdapter中创建的片段永远不会被销毁。这就是为什么我总是更喜欢FragmentStatePagerAdapter


2
我知道这已经很老了,但我还是会加上去以防万一。FragmentPagerAdapter 会在内存中保留片段,如果只有几个选项卡,则使用该适配器。FragmentStatePagerAdapter 将在每次滑动时销毁片段实例以节省内存。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接