2015-01-23 11 views
13

Meine Activity enthält eine ViewPager und es ist benutzerdefinierte Adapter, die FragmentStatePagerAdapter erweitert. ViewPager enthält 3 FragmentePagerAdapter.notifyDataSetChanged aktualisiert keine Fragmente

Code-Fragmente aus dem 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); 
} 

zu entfernen, wenn der mittleren Fragment (Index 1) Entfernen:

  • von data Ich entferne die richtige item.
  • Problem ist, dass i (i guess) Fragment 3 nach notifyDataSetChanged entfernt wird und der Strom Fragment ist immer noch das Fragment, das die Benutzer Säge und die Daten, die aus dem SavedInstance Bündel geladen werden
  • ist

So Ende Ergebnis, dass der Benutzer immer noch das gleiche Fragment sehen, dass er versucht zu entfernen, die für ihn irgendwie saugen ist.

Ideen?

+0

Ich würde vorschlagen, zu [mein 'ArrayPagerAdapter'] (https://github.com/commonsguy/cwac-pager) zu wechseln, der dies behandelt. Ich bin nicht sonderlich überrascht, dass 'FragmentStatePagerAdapter' in diesem Bereich Probleme hat, weshalb ich etwas getrennt habe. – CommonsWare

+0

Versuchen Sie [dies] (http://Stackoverflow.com/a/26944013/5287436) –

Antwort

21

Versuchen Sie, diese Zugabe:

private class MyPagerAdapter extends FragmentStatePagerAdapter { 

//... your existing code 

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

} 
+0

aber dann wird es Android alle meine Fragmente neu starten, die Art von sinnlos ist nein? – royB

+0

Ja, [hier] (http://stackoverflow.com/questions/7263291/viewpager-pageradapter-not-updating-the-view) andere Optionen – kelvincer

+1

Ich weiß über diese 2 Optionen und ich sah diese Beiträge, bevor Sie die Frage stellen. Das Problem ist, dass ich eine Ansicht nicht aktualisiere, sondern eine entferne. Ich kann nicht sicher sein, welche Ansicht entfernt wird, so dass Fragment für Tag aufgerufen wird, ist nicht wirklich sicher (vielleicht ist es bereits zerstört? sollte ich alle anderen Fragmente aktualisieren?) – royB

1

Sie haben keine andere Wahl, als PagerAdapter#getItemPosition zu implementieren. Wenn Sie die Quelle betrachten, bestimmt ViewPager genau, wie sie ihre Position aktualisieren soll. Fügen Sie nach notifyDataSetChanged neue Fragmente hinzu oder löschen Sie sie. Es sollte nicht zu schwer sein, Sie müssen nur auf den Zustand des übergebenen Fragments zugreifen, und Sie müssen auch auf den Master-Status in Ihrer Aktivität zugreifen, die Ihre Bestellung enthält.

Es ist auch erforderlich, dass Sie getItemId implementieren, um eine konsistente ID für jedes Fragment zurückzugeben, da sie neu geordnet werden können.

So behandelte ich es in einem ViewPager von Fotos.

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

Sie können versuchen, FragmentPagerAdapter anstelle von FragmentStatePagerAdapter zu verwenden. Die Sache ist, ich bin auch auf dieses Problem gestoßen, und es hat mir geholfen.

+0

Single-Line-Lösung sollte im Kommentar veröffentlicht werden. – Rumit

Verwandte Themen