ViewPager восстанавливает старые фрагменты при повороте экрана
я используюViewPager
а такжеFragmentStatePagerAdapter
показать фрагмент. Первоначально добавлено 2 фрагмента Fragment1 и Fragment2, а третий фрагмент Fragment3 добавлен на 2-й позиции после получения ответа от сервера. Поэтому после добавления всех страниц это должна быть последовательность фрагментов в ViewPager -> Фрагмент1, Фрагмент3, Фрагмент2.
Проблема в том, что после добавления Fragment1 и Fragment3 приложение выполняет серверный вызов перед добавлением 3-го фрагмента во 2-ю позицию, если я делаю поворот экрана несколько раз, то после добавления 3-го фрагмента он все еще показывает старую копию Fragment2, которая изначально была на 2-й позиции во 2-й позиции. позиция и третья позиция имеют новую копию Fragment2. Итак, фрагмент Fraest3 появляется в ViewPager. Последовательность после добавления 3-го фрагмента -> Фрагмент1, старая копия Фрагмента2, Новый фрагмент2.
Я переопределяюonSaveInstanceState
и звонитsuper.onSaveInstanceState
в моей деятельности.
Также я попытался вернутьсяPOSITION_NONE
отgetItemPosition
, Я где-то читал, что ViewPager сохраняет копии фрагмента. Также с помощью отладки я проверил, что ViewPager содержал 2 копии Fragment2, когда проблема воспроизводилась, хотяgetItem
изFragmentStatePagerAdapter
возвращал разные фрагменты для каждой позиции, но все еще на 2-й позиции показывал старый фрагмент. Для целей тестирования вgetItem
Я вернул Fragment1 для всех позиций, чтобы все 3 страницы были одинаковыми, но даже после этого на 2-й позиции показывался старый экземпляр Fragment2, когда я воспроизвел проблему с шагами, упомянутыми выше.
Так как очиститьViewPager
чтобы не сохранять старые фрагменты. Как обновить ViewPager, чтобы он не сохранял старую копию с фрагментами. Я думаю, что проблема с onSaveInstanceState, но мне это нужно. Как я могу исключитьViewPager
когда представления сохраняются вonSaveInstanceState
, я пыталсяmViewPager.setSaveEnabled(false)
но это занимает слишком много памяти.
Я обнаружил, что проблема в том,instantiateItem
метод адаптера не вызывает getItem, из-за которого возвращается старый фрагмент.
Ниже приведен код решения
Код:
@Override
public Object instantiateItem(ViewGroup container, int position) {
Object obj = super.instantiateItem(container, position);
Fragment fragment = mFragments.get(position);
if((obj!=null && fragment!=null) && !(obj.getClass().getSimpleName().equals(fragment.clss.getSimpleName()))){
destroyItem(container, position, obj);
return super.instantiateItem(container, position);
}else{
return obj;
}
}