У меня есть одно действие с 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);
}
Абсолютно ничего особенного
Кто-нибудь понимает, почему это происходит?