7

Tengo un problema con ViewPager donde mi ListView está perdiendo su posición de desplazamiento.¿Fragmento no llama a Save InstanceState al deslizar ViewPager?

El estado de la ListView puede ser fácilmente almacenado y restaurado usando:

@Override 
public View onCreateView (LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 
{ 
    View v = inflater.inflate(R.layout.frag_cool_things, container, false); 

    AdvListView listView = (AdvListView) v.findViewById(R.id.lv0); 
    listView.setOnItemClickListener(mOnListItemClicked); 

    if (null != savedInstanceState) 
    { 
     listView.onRestoreListViewInstanceState(savedInstanceState.getParcelable("list_state")); 
    } 

    mListView = listView; 

    return v; 
} 

@Override 
public void onSaveInstanceState (Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 

    outState.putParcelable("list_state", mListView.onSaveListViewInstanceState()); 
} 

Sin embargo, el problema es que cuando los fragmentos están siendo pasáses onDestroyView() es llamada pero nunca llama onSaveInstanceState (Bundle outState).

Girando la pantalla y tal restaura el estado ListView bien pero deslizando No puedo encontrar la forma de restaurar la lista correctamente.

Respuesta

15

Actualización 12/17/11:
De hecho, encontré la manera correcta de guardar el contenido de los fragmentos. Debe usar FragmentStatePagerAdapter. ¡Este adaptador guarda correctamente el estado del fragmento! :)

VIEJO:
Bueno he encontrado una manera de hacer esto .. Por favor comparta su entrada si usted cree que esto es un gran no no! : P

Aquí es mi clase FragmentBase que fija este número:

public abstract class FragmentBase extends Fragment 
{ 
    private boolean mInstanceAlreadySaved; 
    private Bundle mSavedOutState; 

    @Override 
    public View onCreateView (LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) 
    { 
     if (null == savedInstanceState && null != mSavedOutState) { 
      savedInstanceState = mSavedOutState; 
     } 

     mInstanceAlreadySaved = false; 
     return onCreateViewSafe(inflater, container, savedInstanceState); 
    } 

    @Override 
    public void onSaveInstanceState (Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
     mInstanceAlreadySaved = true; 
    } 

    @Override 
    public void onStop() 
    { 
     if (!mInstanceAlreadySaved) 
     { 
      mSavedOutState = new Bundle(); 
      onSaveInstanceState(mSavedOutState); 
     } 

     super.onStop(); 
    } 

    public abstract View onCreateViewSafe (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState); 
} 
+0

Mi propia solución temporal es simplemente escribir mis cosas a los SharedPreferences en OnPause(), y obtener de nuevo en OnCreateView (...) Sin embargo, esto te obliga a acceder a la actividad de vinculación para obtener las Preferencias Compartidas (getActivity(). GetSharedPreferences (...)), y también podrías necesitar eliminar explícitamente cosas no deseadas cuando la actividad se derribe (dependiendo de lo que estés almacenamiento, ofc). Espero que alguien tenga una mejor manera! :) –

+0

Consulte la respuesta actualizada :) – Jona

+0

"FragmentPagerAdapter separará cada fragmento al pasar por la lista, pero manténgalos en la memoria para que puedan volverse a unir simplemente cuando el usuario retroceda. Si tiene un número mayor de Fragmentos, el FragmentStatePagerAdapter vale la pena considerarlo ya que los eliminará, con la desventaja de que necesitan ser reconstruidos a medida que el usuario se los devuelve. Por lo tanto, si tiene menos fragmentos más complejos, FragmentPagerAdapter tiene sentido, pero considere FragmentStatePagerAdapter para conjuntos más grandes ". (Android Dev Blog) –

Cuestiones relacionadas