android - Optimize instance of google map inside a Tab ( Sherlock ActionBar) -


i have google map inside tab. when change tab, , come google maps tab, map loading once more. there way load map once, , instance when switching tab???

here code :

code managing 2 tabs :

public class fragmenttabspdv extends baseactivity { private arraylist<pdv> listapdv;  @override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);      databasehandlertienda db = new databasehandlertienda(this);     listapdv = (arraylist<pdv>) db.getalltiendas();      actionbar actionbar = getsupportactionbar();     actionbar.setnavigationmode(actionbar.navigation_mode_tabs);     actionbar.tab tab1 = actionbar.newtab();     tab1.settext("lista");     tab1.seticon(r.drawable.ic_action_view_as_list);      actionbar.tab tab2 = getsupportactionbar().newtab();     tab2.settext("mapa");     tab2.seticon(r.drawable.ic_action_location_map);     actionbar.setdisplayhomeasupenabled(true);     actionbar.settitle("");      actionbar.setdisplayoptions(actionbar.display_show_home             | actionbar.display_show_title | actionbar.display_show_custom);      // create 2 fragments want use display content      tab1.settablistener(new tablistener<listpdvtabfragment>(this,             "lista", listpdvtabfragment.class));     tab2.settablistener(new tablistener<mappdvtabfragment>(this,             "mapa", mappdvtabfragment.class));      actionbar.addtab(tab1);     actionbar.addtab(tab2); }  public arraylist<pdv> getlistapdv() {     return listapdv; }  public void setlistapdv(arraylist<pdv> listapdv) {     this.listapdv = listapdv; }  public static class tablistener<t extends fragment> implements         actionbar.tablistener {     private fragment mfragment;     private final activity mactivity;     private final string mtag;     private final class<t> mclass;      /**      * constructor used each time new tab created.      *       * @param activity      *            host activity, used instantiate fragment      * @param tag      *            identifier tag fragment      * @param clz      *            fragment's class, used instantiate fragment      */     public tablistener(activity activity, string tag, class<t> clz) {         mactivity = activity;         mtag = tag;         mclass = clz;     }      /* following each of actionbar.tablistener callbacks */      public void ontabselected(actionbar.tab tab, fragmenttransaction ft) {         // check if fragment initialized         if (mfragment == null) {             // if not, instantiate , add activity             mfragment = fragment.instantiate(mactivity, mclass.getname());             ft.add(android.r.id.content, mfragment, mtag);         } else {             // if exists, attach in order show             ft.attach(mfragment);         }     }      public void ontabunselected(actionbar.tab tab, fragmenttransaction ft) {         if (mfragment != null) {             // detach fragment, because 1 being attached             ft.detach(mfragment);         }     }      public void ontabreselected(actionbar.tab tab, fragmenttransaction ft) {         // user selected selected tab. nothing.     } }    } 

code google maps tab :

public class mappdvtabfragment extends sherlockfragment implements   googlemap.onmarkerclicklistener { private mapview mapview; private googlemap map; private arraylist<pdv> pdvs; private viewpager pager; private pageradapter pageradapter; private view fragmentview; boolean shownoresults = false;  // private hashmap<string, pdv> markertorestaurantavailabilitymap = new // hashmap(); @override public void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setretaininstance(true); }  @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) {     view v = inflater.inflate(r.layout.tab_frag_map_pdv, container, false);     fragmentview = v;     bundle localbundle = null;     if (savedinstancestate != null)         localbundle = (bundle) savedinstancestate.getparcelable("mapviewbundle");      // gets mapview xml layout , creates     mapview = (mapview) v.findviewbyid(r.id.map);      // gets googlemap mapview , initialization stuff      mapview.oncreate(localbundle);     mapview.onresume();// needed map display     map = mapview.getmap();     map.getuisettings().setmylocationbuttonenabled(false);     map.setonmarkerclicklistener(this);      // needs call mapsinitializer before doing cameraupdatefactory     // calls     try {         mapsinitializer.initialize(this.getactivity());     } catch (googleplayservicesnotavailableexception e) {         e.printstacktrace();     }      // updates location , zoom of mapview     map.setmylocationenabled(true);     int zoom = 14;     cameraupdate here = cameraupdatefactory.newlatlngzoom(new latlng(19.359180, -99.180901), zoom);     map.movecamera(here);     fragmenttabspdv parent = (fragmenttabspdv) getactivity();     pdvs = parent.getlistapdv();     if (pdvs != null && pdvs.size() > 0)         shownoresults = false;     else         shownoresults = true;     displaypdvonmap(pdvs); // display marker ( work well)     initpager();     return v; }  @override public void onresume() {     mapview.onresume();     super.onresume(); }  @override public void onpause() {     super.onpause();     if (mapview != null)         mapview.onpause(); }  @override public void ondestroy() {     super.ondestroy();     mapview.ondestroy(); }  @override public void onsaveinstancestate(bundle outstate) {     super.onsaveinstancestate(outstate);     if (mapview != null)         mapview.onsaveinstancestate(outstate); }  @override public void onlowmemory() {     super.onlowmemory();     mapview.onlowmemory(); }  @override public void onactivitycreated(bundle savedinstancestate) {     super.onactivitycreated(savedinstancestate);  }  public void displaypdvonmap(arraylist<pdv> tiendas) {     (pdv pdv : tiendas) {         marker marker = map.addmarker(new markeroptions()                 .position(new latlng(pdv.getlatitude(), pdv.getlongitude())).title(pdv.gettienda())                 .snippet(pdv.getcalle()));         pdv.setmarker(marker);     } }  public void initpager() {      pager = ((viewpager) fragmentview.findviewbyid(r.id.pager));     pager.setoffscreenpagelimit(3);     pager.setonpagechangelistener(new viewpager.onpagechangelistener() {         public void onpagescrollstatechanged(int paramanonymousint) {         }          public void onpagescrolled(int paramanonymousint1, float paramanonymousfloat, int paramanonymousint2) {         }          public void onpageselected(int position) {              pdv pdv = pdvs.get(position);             marker m = pdv.getmarker();             m.showinfowindow();             // center map on current marker             cameraupdate here = cameraupdatefactory.newlatlngzoom(m.getposition(), 14);             map.animatecamera(here);          }     });     pager.setsaveenabled(false);     pageradapter = new pageradapter() {          public void destroyitem(viewgroup paramanonymousviewgroup, int paramanonymousint,                 object paramanonymousobject) {             paramanonymousviewgroup.removeview((view) paramanonymousobject);         }          public int getcount() {              if (shownoresults)                 return 1;             if (pdvs != null)                 return pdvs.size();             return 0;         }          public object instantiateitem(view container, int position) {             view view = null;             if (shownoresults) {                 view = getlayoutinflater(null).inflate(r.layout.map_pager_empty, null);             } else {                 view = getlayoutinflater(null).inflate(r.layout.row_lista_pdv, null);                 pdv pdv = pdvs.get(position);                 textview tienda_name = (textview) view.findviewbyid(r.id.tienda_name);                 textview direccion = (textview) view.findviewbyid(r.id.tienda_dir);                 textview contacto = (textview) view.findviewbyid(r.id.tienda_contact);                 textview horini = (textview) view.findviewbyid(r.id.tienda_horarioini);                 textview horfin = (textview) view.findviewbyid(r.id.tienda_horariofin);                  tienda_name.settext(pdv.gettienda());                 direccion.settext(pdv.getcalle());                 contacto.settext(pdv.getcontacto());                 horini.settext(pdv.gethorarioini());                 horfin.settext(pdv.gethorariofin());              }              ((viewpager) container).addview(view, 0);             return view;         }          public boolean isviewfromobject(view paramanonymousview, object paramanonymousobject) {             return paramanonymousview == paramanonymousobject;         }     };     this.pager.setadapter(this.pageradapter);     return;     // this.pager.removeallviews();  }  @override public boolean onmarkerclick(marker marker) {     int = 0;     = getpdvposition(marker);     if (i >= 0)         pager.setcurrentitem(i, true);     return false; }  private int getpdvposition(marker marker) {     int position = 0;     (pdv pdv : pdvs) {         marker m = pdv.getmarker();         string mid1 = m.getid();         string mid2 = marker.getid();         if (mid1.equals(mid2)) {             return position;         }         position++;     }     return 0; }   } 

the lightest-weight way show 1 fragment , hide via show() , hide().

attach() , detach() have similar effect in terms of user sees, trigger onattach() , ondetach() lifecycle methods in fragment. fragments nothing here. other fragments may more work here. presumably, maps v2 fragments more work here.

this may cause problems in other scenarios well, such using fragmentstatepageradapter, (iirc) uses attach() , detach() under covers.


Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -