android - Remove all fragments from ViewPager populated by FragmentStatePagerAdapter -
i have viewpager populating fragments(representing objects arraylistofobjects) using fragmentstatepageradapter. works well:
mmyfragmentpageradapter = new fragmentadapter(getsupportfragmentmanager(),orientation ,repopulatedfireinfolist); mpager = (viewpager)findviewbyid(r.id.fireinfofragment_container); initbutton(); settab(); mpager.setadapter(mmyfragmentpageradapter); the fragment adapter extends fragmentstatepageradapter.
from primary activity launch dialog themed activity; user may add new favourite location creating new object alters arraylist of objects passed primary activity. code starting dialog activity; works fine:
intent locationintent = new intent(afiscontroller.this, locationactivity.class); locationintent.putextra("fireslist", new fireinfolistwrapper(arraylistofobjects)); startactivityforresult(locationintent,1); the floating activity adds objects arraylistofobjects.
on primary activity's onactivityresult compare arralistofobjects i'm receiving 1 sent; if different want remove contents of viewpager , recreate new arraylistofobjects. onactivityresults:
protected void onactivityresult(int requestcode, int resultcode, intent data) { toast.maketext(this, "activity results fired..." , 1500 ).show(); if ((resultcode == 0) && (data != null)) { log.i("onactvityresult", "inside resultcode check"); bundle b = data.getextras(); if(b != null){ log.i("onactvityresult", "not null"); returnedfireinfolist = (arraylist<fireinfo>) data.getserializableextra("fireslistresult"); log.i("onactvityresult", "results size: "+returnedfireinfolist.size()); if(returnedfireinfolist.size()>0){ log.i("onactvityresult", "locationname: "+returnedfireinfolist.get(0).getlocationname()); //compare returnedfireinfolist , repopulatedfireinfolist, if different; //add difference repopulatedfireinfolist , write file. updatefireinfos(returnedfireinfolist, repopulatedfireinfolist); if(returnedfireinfolist.size()!=repopulatedfireinfolist.size()){ mmyfragmentpageradapter1 = new fragmentadapter(getsupportfragmentmanager(),orientation ,returnedfireinfolist); mpager = (viewpager)findviewbyid(r.id.fireinfofragment_container); log.i("updatefireinfos", "fragmentscount is"+mpager.getcurrentitem()); fireinfofragment fragment = (fireinfofragment) getsupportfragmentmanager().findfragmentbyid(r.id.fireinfofragment_container); //this problem is, don't want remember on viewpager //called mpager before. // mpager.removeallviews(); //mpager.setadapter(null); mmyfragmentpageradapter1.notifydatasetchanged(); mpager.setadapter(mmyfragmentpageradapter1); mmyfragmentpageradapter1.notifydatasetchanged(); } } } this fragmentstateadapter code:
public class fragmentadapter extends fragmentstatepageradapter { private fragmentmanager fragmentmanager; private fragmenttransaction mcurtransaction = null; private arraylist<fragment.savedstate> msavedstate = new arraylist<fragment.savedstate>(); private arraylist<fragment> mfragments = new arraylist<fragment>(); private fragment mcurrentprimaryitem = null; public void restorestate(parcelable state, classloader loader) { //need delete info marked fragments (theoned stored on orientationchange //currently redoing entire call; resulting in delay due server call //if(islastorientationportrait != isportrait){ if(state != null){ bundle bundle1 = (bundle) state; bundle1.setclassloader(loader); iterable<string> keys = bundle1.keyset(); log.i("restorestate", "containskey fragmentstatepageradapter: "+keys); //android.support.v4.app.fragmentmanager fragmentmanager= fragmentadapter.this.fragmentmanager; android.support.v4.app.fragmenttransaction fragmenttransaction = fragmentmanager.begintransaction(); //if (fragmenttransaction == null) { // log.i("restorestate", "fragmenttransactiontest"); fragmenttransaction = fragmentmanager.begintransaction(); // } (string key : keys) { if (key.startswith("f")) { fragment f = fragmentmanager.getfragment(bundle1, key); fragmenttransaction.remove(f); fragmenttransaction.commit(); } } } //} } @override public int getitemposition(object object) { // todo auto-generated method stub //return super.getitemposition(object); return fragmentadapter.position_none; } public fragmentadapter(android.support.v4.app.fragmentmanager fragmentmanager,string orientation, arraylist<fireinfo> fireinfolist) { super(fragmentmanager); this.orientation = orientation; this.fireinfolist = fireinfolist; this.numitems = fireinfolist.size(); this.fragmentmanager=fragmentmanager; } arraylist<fireinfo> fireinfolist; string orientation; int numitems; @override public int getcount() { log.i("numitems", "is: "+fireinfolist.size()); return numitems; } @override public fragment getitem(int arg0) { log.i("fragmentadapterindex", "is: "+arg0); return fireinfofragment.newinstance(orientation, fireinfolist.get(arg0)); } }
problem: new arraylistofobjects added alongside old 1 before fired startactivityfor results.
how force viewpager forget old content? reset viewpager adapter newarraylistofobjects using fragmentstateadapter?
i guess problem in fact old fragments still reside in fragmentmanager use adapter. if case have remove old fragments fragment manager.
so execute following code in constructor of adapter:
public fragmentadapter(fragmentmanager fragmentmanager, string orientation, arraylist<fireinfo> list) { super(fragmentmanager); if (fragmentmanager.getfragments() != null) { fragmentmanager.getfragments().clear(); } //... other code here } these lines of code useless:
mmyfragmentpageradapter1.notifydatasetchanged(); p.s. , yeah, do not start class names lower-case letter.
edit: may more correct remove fragments using fragmenttransaction:
list<fragment> fragments = fragmentmanager.getfragments(); if (fragments != null) { fragmenttransaction ft = fragmentmanager.begintransaction(); (fragment f : fragments) { //you can perform additional check remove (not all) fragments: if (f instanceof addedbycurrentpageradapterfragment) { ft.remove(f); } } ft.commitallowingstateloss(); } this take time fragmenttransaction (asynchronously) performed.
Comments
Post a Comment