2013-08-31 15 views
5

Sto usando ViewPager e FragmentStatePagerAdapter per mostrare il frammento. Inizialmente ci sono 2 frammenti aggiunti Fragment1 e Fragment2 e 3rd framment Fragment3 viene aggiunto in 2a posizione dopo aver ricevuto la risposta dal server. Quindi, dopo aver aggiunto tutte le pagine, questa dovrebbe essere la sequenza di Frammenti in ViewPager -> Fragment1, Fragment3, Fragment2.ViewPager che ripete i vecchi frammenti sulla rotazione dello schermo

Il problema è dopo Fragment1 e Fragment3 vengono aggiunti e l'app sta effettuando una chiamata al server prima di aggiungere 3 ° frammento in 2 posizione se eseguo più volte la rotazione dello schermo e dopo aver aggiunto il terzo frammento mostra ancora la vecchia copia di Fragment2 che era al 2 ° posizione inizialmente in seconda posizione e terza posizione con nuova copia di Fragment2. Così Framment3 si presenta in ViewPager. Sequenza dopo l'aggiunta del terzo frammento -> Fragment1, vecchia copia di Fragment2, New Fragment2.

Sto ignorando onSaveInstanceState e chiamando super.onSaveInstanceState nella mia attività.

Inoltre, ho provato a restituire POSITION_NONE da getItemPosition. Ho letto da qualche parte che ViewPager salva copie di frammenti. Inoltre, eseguendo il debug, ho verificato che ViewPager contenesse 2 copie di Fragment2 quando il problema è stato riprodotto, anche se getItem di FragmentStatePagerAdapter ha restituito diversi frammenti per ciascuna posizione, ma ancora in seconda posizione mostrava il vecchio frammento. A scopo di test in getItem ho restituito Fragment1 per tutte le posizioni in modo che tutte e 3 le pagine dovessero essere uguali ma anche dopo che nella seconda posizione mostrava la vecchia copia di Fragment2 quando riproducevo il problema con i passaggi sopra menzionati.

Quindi, come cancellare ViewPager in modo che non salvi i vecchi frammenti. Come aggiornare ViewPager in modo che non conservi la vecchia copia con i frammenti. Penso che il problema sia con onSaveInstanceState ma ne ho bisogno. Come posso escludere ViewPager quando le viste vengono salvate in onSaveInstanceState. Ho provato mViewPager.setSaveEnabled(false) ma ci vuole troppa memoria.

Ho trovato che il problema è il metodo instantiateItem della scheda non chiama getItem a causa del quale viene restituito il vecchio frammento.

Qui di seguito è il codice soluzione

Codice:

@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; 
      } 
     } 
+0

Hai controllato [questo?] (Http://stackoverflow.com/a/9646622/1396082) –

+0

Hai rimosso il tuo commento ... Ha funzionato per te ora? –

+0

Il problema è il metodo instantiateItem della scheda non chiama getItem a causa della quale viene restituito il vecchio frammento. Sto trovando un modo per farlo chiamare getItem. – anujprashar

risposta

1

ho risolto il problema, sto inviando la mia soluzione qui. Eseguo l'override di instantiateItem di FragmentStatePagerAdapter e al suo interno sto ottenendo l'oggetto da super.instantiateItem e confrontando il suo nome classe con il nome classe dell'oggetto in quella posizione dall'elenco dei frammenti che sto mantenendo.

Se classname non è uguale, la sua media super.instantiateItem restituisce un frammento duplicato. Quindi chiamo destroyItem in quella posizione e di nuovo chiamando super.instantiateItem e restituendolo da instantiateItem.

FragmentStatePagerAdapter restituisce il vecchio frammento perché nell'arrayylist codice mFragments ha un frammento duplicato e restituisce solo il frammento nella posizione corrente. Penso che dovrebbe confrontare il frammento nella posizione in elenco con il frammento attualmente visualizzato prima di restituirlo.

+2

puoi mostrarmi un codice (fittizio) per favore? Non capisco la tua soluzione con solo parole (scusa, non va bene in inglese). – Poutrathor

+0

@Poutrathor Ci scusiamo per la risposta in ritardo. Ho aggiunto il codice in risposta. – anujprashar

+0

puoi per favore pubblicare il codice? – k2ibegin

2

ignorare solo questo metodo in FragmentpagerAdapter

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
     // TODO Auto-generated method stub 
     super.destroyItem(ViewGroup container, int position, Object object); 
} 

quindi rimuovere super.destroyItem(ViewGroup container, int position, Object object); dal codice

Problemi correlati