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

Popular posts from this blog

Change php variable from jquery value using ajax (same page) -

Pull out data related to my apps from Android Play Store and iOS App Store -

How can I fetch data from a web server in an android application? -