ViewPager retaing viejos fragmentos en la rotación de pantalla
estoy usandoViewPager
yFragmentStatePagerAdapter
para mostrar el fragmento. Inicialmente, se agregaron 2 fragmentos Fragment1 y Fragment2 y el tercer fragmento Fragment3 se agrega en la 2ª posición después de recibir la respuesta del servidor. Entonces, después de agregar todas las páginas, esta debe ser la secuencia de Fragmentos en ViewPager -> Fragment1, Fragment3, Fragment2.
El problema es después de que se agregan Fragment1 y Fragment3 y la aplicación está haciendo una llamada al servidor antes de agregar el 3.º Fragmento en la segunda posición. Posición y 3ª posición tienen nueva copia de Fragment2. Así que Fragment3 Doest se muestra en ViewPager. Secuencia después de agregar el 3er Fragmento -> Fragmento 1, copia antigua de Fragmento 2, Nuevo Fragmento 2.
Estoy anulandoonSaveInstanceState
y llamandosuper.onSaveInstanceState
en mi actividad.
También he intentado volverPOSITION_NONE
desdegetItemPosition
. Leí en alguna parte que ViewPager guarda copias del fragmento. También a través de la depuración, verifiqué que ViewPager contenía 2 copias de Fragment2 cuando se reproducía el problema, aunquegetItem
deFragmentStatePagerAdapter
devolvió diferentes Fragmentos para cada posición, pero aún en la 2ª posición mostraba un fragmento antiguo. Para fines de prueba engetItem
Devolví Fragment1 para todas las posiciones, de modo que las 3 páginas deberían ser iguales, pero incluso después de eso, en la 2ª posición, estaba mostrando una copia antigua de Fragment2 cuando reproduje el problema con los pasos mencionados anteriormente.
Entonces, ¿cómo aclararViewPager
Para que no se guarden viejos fragmentos. Cómo actualizar ViewPager para que no retenga la copia antigua con fragmentos. Creo que el problema es con onSaveInstanceState pero lo necesito. Como puedo excluirViewPager
cuando las vistas se guardan enonSaveInstanceState
. Yo he tratadomViewPager.setSaveEnabled(false)
pero se necesita demasiada memoria.
Encontré que el problema esinstantiateItem
el método del adaptador no llama a getItem debido a que se devuelve el fragmento antiguo.
A continuación se muestra el código de la solución
Código:
@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;
}
}