2011-10-26 5 views
5

Sto utilizzando uno ViewPager con un PagerFragmentAdapter personalizzato che utilizza un elenco interno per fornire i frammenti. Vorrei aggiungere e rimuovere i frammenti in modo dinamico sulle modifiche alle impostazioni.Aggiunta e rimozione di frammenti dinamicamente in ViewPager

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fragment_pager); 
    mAdapter = new ServicePagerAdapter(getSupportFragmentManager()); 
    mPager = (ViewPager) findViewById(R.id.pager); 
    mPager.setAdapter(mAdapter); 
} 

Ho provato a richiamare il setAdapter ma ottenere una IllegalStateException (Can not perform this action after onSaveInstanceState).

Come posso raggiungere il mio scopo?

risposta

2

Non è necessario reimpostare il tuo ServicePagerAdapter ogni volta. È sufficiente crearlo e impostarlo una volta nel metodo onCreate() del tuo Activity (o nel metodo onActivityCreated() del tuo Fragment) e quindi puoi semplicemente chiamare il metodo add() dell'adattatore per aggiungere nuovi elementi. Ma non dimenticare di chiamare notifyDataSetChanged() dopo ogni aggiunta all'adattatore.

+0

Sfortunatamente non è così facile. FragmentPagerAdapter memorizza nella cache i frammenti, devi creare un PagerAdapter personalizzato o utilizzare alcuni trucchi. – Matroska

+0

nell'esempio di codice menzioni 'ServicePagerAdapter' - questa non è una classe di libreria, quindi ho pensato che tu stia già usando un adattatore personalizzato. Quindi sì, è necessaria l'implementazione personalizzata della classe 'PagerAdapter'. Per quanto riguarda la tua domanda principale, penso che sia stata data risposta. – HitOdessit

+2

Non è sufficiente chiamare notifyDataSetChanged() sul PagerAdapter se gli elementi sono stati rimossi. È necessario anche sovrascrivere il metodo getItemPosition di PagerAdapter. Ritorna POSITION_UNCHANGED se l'elemento è ancora lì o POSITION_NONE se è stato rimosso. –