在FragmentPagerAdapter上调用InstantiateItem或getItem

时间:2019-03-31 22:35:14

标签: android android-fragments android-viewpager fragmentmanager

我有一个带有自定义FragmentAdapter的viewpager活动。

这是我的适配器代码:

this.viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            SparseArray<WeakReference<Fragment>> registeredFragments = new SparseArray<>(4);

            @NonNull
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                Fragment fragment = (Fragment) super.instantiateItem(container, position);
                this.registeredFragments.put(position, new WeakReference<>(fragment));
                return fragment;
            }


            @Override
            public int getCount() {
                return 4;
            }

            @Override
            public android.support.v4.app.Fragment getItem(int position) {
                WeakReference<Fragment> ret = this.registeredFragments.get(position);

                if (ret == null || ret.get() == null) {
                    if (position == 0)
                        ret = new WeakReference<>(new NewGiveawayStepFragment1());
                    else if (position == 1)
                        ret = new WeakReference<>(NewGiveawayStepFragment2.newInstance(getUser().getApiFacade().getProfilePicUrl()));
                    else if (position == 2)
                        ret = new WeakReference<>(new NewGiveawayStepFragment3());
                    else if (position == 3)
                        ret = new WeakReference<>(NewGiveawayStepFragment4.newInstance(getUser().getApiFacade().getProfilePicUrl()));
                }
                return ret.get();
            }
        });

想法是在创建片段之后,我将它们存储到SparseArray中,并避免重新创建它们(我知道我可能具有相同的行为viewPager.setOffscreenPageLimit();,但这会使活动在第一次加载时花费更长的时间

此想法基于以下答案:
https://stackoverflow.com/a/15261142/5679560

在正常的幸福世界中,一切正常...

问题是,当用户最小化应用程序时-> android决定保存状态并关闭应用程序->他们会恢复应用程序...

在这种情况下,当用户还原应用程序时,将永远不会创建页面setOffscreenPageLimit

因此,请更具体一点:
1位用户加载活动
2用户负载查看页面0
3位用户将应用程序最小化,Android将其关闭
4位用户恢复了应用程序,确定
5位使用者前往检视页面1 OK
6位用户进入浏览页2 instantiateItem从未被调用getItem从未被调用并显示空白页面
7位用户前往浏览页面3 instantiateItem从未被调用getItem从未被调用并显示空白页面

没有引发异常。如果用户在第1页离开该应用程序,则在恢复时第0,1和2页就可以了,如果用户在第3页离开了,那么第2页和第3页就可以了

这是我的活动onRestoreInstanceState

  @Override
    public void onRestoreInstanceState(@Nullable Bundle savedInstanceState) {
        this.currentPage = savedInstanceState.getInt("currentPage");
        this.ignoreSpam = savedInstanceState.getBoolean("ignoreSpam", false);
        super.onRestoreInstanceState(savedInstanceState);
    }

绝对没什么特别的

有人知道为什么会这样吗?

0 个答案:

没有答案