2015-01-23 10 views
13

Il mio Activity contiene un ViewPager ed è personalizzato Adapter che si estende FragmentStatePagerAdapter. ViewPager comprende 3 frammentiPagerAdapter.notifyDataSetChanged non aggiorna i frammenti

codice per rimuovere frammenti dal ViewPager

MainActivity

public void deleteElement(){ 
    final int currentItem = mViewPager.getCurrentItem(); 
    mPagerAdapter.removeItem(currentItem); 
    mPagerAdapter.notifyDataSetChanged(); 
} 

CustomPagerAdapter

private ArrayList<Item> data; 
public void removeItem(int index){ 
     data.remove(index); 
} 

quando si toglie il mezzo Fragment (indice 1):

  • da data sto rimuovendo il corretto item.
  • problema è che (immagino) Fragment 3 viene rimosso dopo notifyDataSetChanged e la corrente Fragment è ancora il frammento che la sega utente ei dati che viene caricato è da SavedInstance fascio

Così fine risultato che l'utente continua a vedere lo stesso Fragment che ha provato a rimuovere, il che è un po 'risucchiato per lui.

Idee?

+0

vorrei suggerire di passare a [la mia 'ArrayPagerAdapter'] (https://github.com/commonsguy/cwac-pager), che gestisce questo. Non sono terribilmente sorpreso dal fatto che 'FragmentStatePagerAdapter' abbia dei problemi in quest'area, ed è per questo che ho creato qualcosa di separato. – CommonsWare

+0

Prova [this] (http://stackoverflow.com/a/26944013/5287436) –

risposta

21

Prova ad aggiungere questo:

private class MyPagerAdapter extends FragmentStatePagerAdapter { 

//... your existing code 

    @Override 
    public int getItemPosition(Object object){ 
     return PagerAdapter.POSITION_NONE; 
    } 

} 
+0

ma poi farà in modo che Android riavvii tutti i miei frammenti che sono un po 'inutili no? – royB

+0

Sì, [qui] (http://stackoverflow.com/questions/7263291/viewpager-pageradapter-not-updating-the-view) altre opzioni – kelvincer

+1

che so di quei 2 opzioni e ho visto quei posti prima di porre la domanda. il problema è che non sto aggiornando una vista ma rimuovendone una. Non posso essere sicuro di quale vista verrà rimossa, quindi chiamare il frammento per tag non è sicuro (forse è già stato distrutto? Devo aggiornare tutti gli altri frammenti?) – royB

1

non hai scelta, ma per implementare PagerAdapter#getItemPosition. Osservando la fonte è esattamente come ViewPager determina come aggiornare la sua posizione, aggiungere nuovi frammenti o eliminare quelli morti dopo lo notifyDataSetChanged. Non dovrebbe essere troppo difficile, devi solo accedere allo stato del frammento passato e devi anche accedere allo stato principale della tua attività che contiene il tuo ordine.

E 'anche necessario implementare getItemId di restituire un ID coerente per ogni frammento, perché possono essere riordinati.

Ecco come ho gestito in un ViewPager di foto.

private inner class PhotoPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) { 
    override fun getItem(position: Int): PhotoViewFragment { 
     // getItem is called to instantiate the fragment for the given page. 
     return PhotoViewFragment.newInstance(position, [email protected][position]) 
    } 

    override fun getItemId(position: Int): Long { 
     return [email protected][position].ID!!.hashCode().toLong() 
    } 

    override fun getItemPosition(`object`: Any): Int { 
     val frag = `object` as PhotoViewFragment 
     val idx = [email protected] { ph -> ph.ID == frag.dataBinding.photo.ID } 
     return if (idx >= 0) idx else PagerAdapter.POSITION_NONE 
    } 

    override fun getCount(): Int { 
     return [email protected] 
    } 
} 
0

Si può provare a utilizzare FragmentPagerAdapter invece di FragmentStatePagerAdapter. Il fatto è che ho anche incontrato questo problema e mi ha aiutato.

+0

soluzione a linea singola dovrebbe essere pubblicata nel commento. – Rumit

Problemi correlati