instantiateItem и getItem не вызываются для FragmentPagerAdapter - PullRequest
1 голос
/ 01 апреля 2019

У меня есть одно действие с ViewPager с пользовательским FragmentAdapter.

Вот мой код адаптера:

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);
    }

Абсолютно ничего особенного

Кто-нибудь понимает, почему это происходит?

...