2015-01-23 19 views
13

Mój Activity zawiera ViewPager i niestandardowy Adapter, który rozszerza się o FragmentStatePagerAdapter. ViewPager zawiera 3 fragmentyPagerAdapter.notifyDataSetChanged nie odświeża fragmentów

kod usunąć fragmenty z 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); 
} 

po usunięciu środkowego Fragment (indeks 1):

  • od data Usuwam poprawne item.
  • problemów jest to, że (chyba) Fragment 3 usuwa się po notifyDataSetChanged i prąd Fragment nadal jest fragmentem, który piła użytkownika i dane, które są ładowane są z SavedInstance wiązki

So krańcach powoduje, że użytkownik nadal widzi ten sam Fragment, który próbował usunąć, a który jest dla niego nieco przyssany.

Pomysły?

+0

Sugerowałbym przejście na [mój 'ArrayPagerAdapter'] (https://github.com/commonsguy/cwac-pager), który to obsługuje. Nie dziwię się, że 'FragmentStatePagerAdapter' ma problemy w tym obszarze, dlatego wyrzuciłem coś osobno. – CommonsWare

+0

Wypróbuj [this] (http://stackoverflow.com/a/26944013/5287436) –

Odpowiedz

21

warto dodać to:

private class MyPagerAdapter extends FragmentStatePagerAdapter { 

//... your existing code 

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

} 
+0

, ale wtedy spowoduje, że android uruchomi ponownie wszystkie moje fragmenty, co jest bezsensowne, nie? – royB

+0

Tak, [tutaj] (http://stackoverflow.com/questions/7263291/viewpager-pageradapter-not-updating-the-view) inne opcje – kelvincer

+1

znam te 2 opcje i zobaczyłem te posty przed zadawaniem pytania. Problem polega na tym, że nie aktualizuję widoku, ale go usuwam. nie mogę być pewien, który widok zostanie usunięty, więc wywoływanie fragmentu za pomocą znacznika nie jest naprawdę bezpieczne (może już jest zniszczone? czy powinienem zaktualizować wszystkie pozostałe fragmenty?) – royB

1

Nie masz wyboru, ale do realizacji PagerAdapter#getItemPosition. Patrząc na źródło, właśnie w ten sposób ViewPager określa sposób aktualizacji swojej pozycji, dodawania nowych fragmentów lub upuszczania martwych po notifyDataSetChanged. Nie powinno to być zbyt trudne, wystarczy uzyskać dostęp do stanu przekazanego fragmentu, a także musisz uzyskać dostęp do stanu głównego w swojej działalności, która zawiera twoje zamówienie.

Wymagane jest również wdrożenie getItemId, aby zwrócić spójny identyfikator dla każdego fragmentu, ponieważ można je zmienić.

W ten sposób obsłużyłem go w ViewPager ze zdjęciami.

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

Możesz spróbować użyć FragmentPagerAdapter zamiast FragmentStatePagerAdapter. Chodzi o to, że również natknąłem się na ten problem i to mi pomogło.

+0

rozwiązanie jednoliniowe powinno być opublikowane w komentarzu. – Rumit