7

Sto riscontrando un problema con ViewPager in cui il mio ListView sta perdendo la sua posizione di scorrimento.Frammento non chiama onSaveInstanceState quando si scorre ViewPager?

Lo stato del ListView può essere facilmente memorizzato e ripristinato utilizzando:

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

Tuttavia, il problema è che quando i frammenti sono fregato onDestroyView() viene chiamato, ma non chiama mai onSaveInstanceState (Bundle outState).

Ruotando lo schermo e ripristini tali lo stato ListView bene, ma scorrendo non riesco a capire come ripristinare l'elenco correttamente.

risposta

15

Aggiornamento 12/17/11:
realtà ho trovato il modo giusto per salvare il contenuto dei frammenti. Devi usare FragmentStatePagerAdapter. Questo adattatore salva correttamente lo stato del frammento! :)

VECCHIO:
Ebbene ho trovato un modo per fare questo .. Si prega di condividere il vostro contributo, se credi che questo è un enorme no no! : P

Qui è la mia classe FragmentBase che risolto il problema:

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

La mia soluzione temporanea è di solo scrivere la mia roba per i SharedPreferences in OnPause(), e farli tornare a OnCreateView (...). Questo, tuttavia, ti costringe ad accedere all'attività di collegamento per ottenere le SharedPreferences (getActivity(). GetSharedPreferences (...)), e potresti anche dover eliminare esplicitamente cose indesiderate quando l'attività viene abbattuta (a seconda di cosa sei memorizzazione, ofc). Spero che qualcuno abbia un modo migliore! :) –

+0

Si prega di consultare la risposta aggiornata :) – Jona

+0

"FragmentPagerAdapter rimuoverà ogni frammento mentre si scorre l'elenco, ma tenerli in memoria in modo che possano essere semplicemente ricollegati quando l'utente fa scorrere indietro. Se si dispone di un numero maggiore di frammenti, il FragmentStatePagerAdapter merita di essere preso in considerazione in quanto rimuoverli, con lo svantaggio di dover essere ricostruiti man mano che l'utente li rimuove. Quindi, se hai frammenti meno complessi, FragmentPagerAdapter ha senso, ma considera FragmentStatePagerAdapter per set più grandi. " (Android Dev Blog) –