2013-07-23 17 views
12

Ecco una situazione. Voglio navigare da Frammento A-> B-> C.Come salvare lo stato di Fragment con listview

In B Frammento c'è listview. All'elemento clic, apro la vista di dettaglio C Fragment. Ofcourse Ho usato il metodo replace e aggiunto addtoBackStack (null) mentre transactiong da B a C in modo che su Indietro premi restituito a B.

Tutto va bene. Ma quando torno a B da C, la vista viene aggiornata e quindi il webservice viene richiamato di nuovo. Non voglio farlo. Voglio mantenere lo stato B Fragment con listview.

Ho ricevuto alcuni post di Conservazione istanza, ma non è stato di grande aiuto.

Qualsiasi aiuto è molto apprezzato.

Grazie.

+0

Hai esaminato l'uso di 'Bundle' e Overriding' onSavedInstance() '? – BC2

+0

Ciao @ dakshbhatt21, hai trovato una soluzione per il tuo problema? Ho lo stesso problema, mi ha infastidito per una settimana senza alcuna svolta. –

+0

hi @mungaihkamau per favore controlla questo articolo http://developer.android.com/training/implementing-navigation/index.html, puoi trovare vari tipi di navigazione quando lavori con i frammenti, basta verificarlo e fammi sapere. – dakshbhatt21

risposta

12

Come spiegato here è possibile utilizzare onSaveInstanceState() per salvare i dati nel pacchetto e recuperare tali dati nel metodo onRestoreInstanceState().

Spesso setRetainState (true) è menzionato come modo per mantenere lo stato dell'interfaccia in frammento, ma non funziona per te perché stai utilizzando il backstack.

Quindi un buon modo per voi potrebbe essere quello di salvare lo scrollPosition in onSaveInstanceState() e ripristinare in onRestoreInstanceState() in questo modo:

public class MyListFragment extends ListFragment { 

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

    int index = this.getListView().getFirstVisiblePosition(); 
    View v = this.getListView().getChildAt(0); 
    int top = (v == null) ? 0 : v.getTop(); 

    outState.putInt("index", index); 
    outState.putInt("top", top); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    [...] 
    if (savedInstanceState != null) { 
     // Restore last state for checked position. 
     index = savedInstanceState.getInt("index", -1); 
     top = savedInstanceState.getInt("top", 0); 
    } 
    if(index!=-1){ 
    this.getListView().setSelectionFromTop(index, top); 
    } 

} 

ulteriormente più si può trovare una più dettagliata esempio simile here.

+1

+1 Funziona davvero GRANDE :) –

+0

@alex Non funziona per me. Ho listview nel pulsante di ricerca (pulsante barra in basso). La mia lista sarà ricreata quando clicco sul pulsante di ricerca qui sotto. Non riesco a salvare lo stato del listview. Aiutami .. –

+0

Puoi per favore pubblicare il tuo layout xml e mostrare il tuo codice. Potrebbe essere meglio iniziare una nuova domanda, per farlo e collegare questa discussione come "simile" – alex

0

puoi salvare definire il tuo ui in oncreate. quando in onCreateView, aggiungilo solo al layout. quindi lo stato di visualizzazione può salvare perfettamente.

questo è il mio sv:

in OnCreate

LayoutInflater inflater = (LayoutInflater) 
      ctx.getSystemService(ctx.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.pulltorefreshgridview, null); 
    mPullRefreshGridView = (PullToRefreshGridView) view 
      .findViewById(R.id.listcate_pullrefresh_gridview); 

forte testo in onCreateView

if (rootView != null) ((LinearLayout)rootView).removeAllViews(); 
View v = inflater.inflate(R.layout.listcate_fragment, container, false); 
rootView = v; 


    ((LinearLayout) v).addView(mPullRefreshGridView, 
      new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.FILL_PARENT, 
        LinearLayout.LayoutParams.FILL_PARENT)); 
0

penso che è possibile salvare la posizione del vostro ListView poco prima che te ne vai frammento B. Forse lo faccio nel frammento B's onStop(). E quando torni indietro, puoi recuperare tale posizione e ripristinarla in ListView, ad esempio nel frammento B onStart(). I dati di posizione possono essere salvati nell'Attività in modo che non vengano persi anche se il frammento è stato rimosso.

Una cosa da notare che (sono stato intrappolato da questo), se i dati di posizione salvata viene aggiornata dal servizio in background, si dovrebbe evitare ripristinandola ListView prima della fase del ciclo di vita onStart() del frammento B, perché in realtà, il framework salverà lo stato della vista appena prima di lasciare il frammento e ripristinarlo al suo ritorno. Quindi, se ripristini la tua posizione prima che il framework lo faccia, i dati di ripristino del framework annulleranno i tuoi.

2

Ho risolto questo problema creando il mio adattatore su onCreate() anziché onCreateView().

Questo perché (penso) il frammento che è stato aggiunto al backstack ha perso la sua vista e quindi deve ricreare la vista. onCreateView() viene chiamato e ricrea incidentalmente l'adattatore.

Problemi correlati