android - change the items in a ListView from another fragment -


i have 2 fragments, lets call them fragment , fragment b, part of navigationdrawer (this activity bound to). in fragment have button. when button pressed, item added listview in fragment b.

what best way this? use intents, savedpreferences, making public(?) or else?

edit 5: 20/7/13 srains latest code

this navigationdrawer use start fragments:

import android.support.v4.app.fragment; import android.support.v4.app.fragmentactivity; import android.support.v4.app.fragmentmanager; import android.app.service; import android.content.context; import android.content.intent; import android.content.sharedpreferences; import android.content.res.configuration; import android.os.bundle; import android.preference.preferencemanager; import android.support.v4.app.actionbardrawertoggle; import android.support.v4.view.gravitycompat; import android.support.v4.widget.drawerlayout; import android.view.menu; import android.view.menuinflater; import android.view.menuitem; import android.view.view; import android.view.windowmanager; import android.view.inputmethod.inputmethodmanager; import android.widget.adapterview; import android.widget.arrayadapter; import android.widget.listview;  public class navigation_drawer extends fragmentactivity {      public drawerlayout mdrawerlayout; // creates drawerlayout called_.     public listview mdrawerlist;     public actionbardrawertoggle mdrawertoggle;      private charsequence mdrawertitle;     private charsequence mtitle;     private string[] mnoteractivities; // creates string array called _.      @override     protected void oncreate(bundle savedinstancestate) {         // todo auto-generated method stub  // setting navigation drawer      } // end of oncreate  // removed menu           @override         public void onitemclick(adapterview<?> parent, view view, int position,                 long id) {             selectitem(position);         }     }      private void selectitem(int position) {           fragmentmanager fragmentmanager = getsupportfragmentmanager();          if (position == 0) {             fragment qnfragment = new quicknotefragment();              ((fragmentbase) qnfragment).setcontext(this);             bundle args = new bundle(); // creates bundle called args             args.putint(quicknotefragment.arg_noteractivity_number, position);               qnfragment.setarguments(args);              fragmentmanager.begintransaction()                     .replace(r.id.content_frame, qnfragment).commit();            } else if (position == 3) {             fragment pendviewpager = new pendviewpager(); // viewpager includes historyfragment             ((fragmentbase) pendviewpager).setcontext(this);             bundle args = new bundle();              pendviewpager.setarguments(args);             fragmentmanager.begintransaction()                     .replace(r.id.content_frame, pendviewpager).commit();         }      // update title etc     }       @override     protected void onpostcreate(bundle savedinstancestate) { // used navdrawer toggle         super.onpostcreate(savedinstancestate);         // sync toggle state after onrestoreinstancestate has occurred.         mdrawertoggle.syncstate();     }      @override     public void onconfigurationchanged(configuration newconfig) { // used navdrawer toggle         super.onconfigurationchanged(newconfig);         // pass configuration change drawer toggles         mdrawertoggle.onconfigurationchanged(newconfig);     }  } 

this quicknotefragment:

import android.support.v4.app.fragment; import android.support.v4.app.fragmentmanager; import android.app.notification; import android.app.notificationmanager; import android.app.pendingintent; import android.content.context; import android.content.intent; import android.content.sharedpreferences; import android.net.uri; import android.os.bundle; import android.preference.preferencemanager; import android.support.v4.app.notificationcompat; import android.view.layoutinflater; import android.view.menu; import android.view.menuinflater; import android.view.menuitem; import android.view.view; import android.view.view.onclicklistener; import android.view.viewgroup; import android.widget.button; import android.widget.checkbox; import android.widget.edittext; import android.widget.textview; import android.widget.toast;  public class quicknotefragment extends fragmentbase implements onclicklistener {      public static final string arg_noteractivity_number = "noter_activity";      button b_create; // removed other defining stuff      @override     public view oncreateview(layoutinflater inflater, viewgroup container,             bundle savedinstancestate) {         view rootview = inflater.inflate(r.layout.quicknote, container, false);         int = getarguments().getint(arg_noteractivity_number);         string noter_activity = getresources().getstringarray(                 r.array.noter_array)[i];         fragmentmanager fm = getfragmentmanager();         setretaininstance(true);          b_create = (button) rootview.findviewbyid(r.id.qn_b_create);          // removed other stuff          getactivity().settitle(noter_activity);         return rootview;     }      @override     public void onclick(view v) {          // todo auto-generated method stub          switch (v.getid()) {          case r.id.qn_b_create:                                string data = "string data";                 datamodel.getinstance().additem(data);              break;         }     }  @override     public void oncreateoptionsmenu(menu menu, menuinflater inflater) {         // todo auto-generated method stub         super.oncreateoptionsmenu(menu, inflater);     }      @override     public boolean onoptionsitemselected(menuitem item) {         // handle item selection          }     }      public interface onitemaddedhandler { // srains code         public void onitemadded(object data);     } } 

this historyfragment (remember part of viewpager):

import java.util.arraylist; import java.util.hashmap; import java.util.list; import java.util.map;  import com.rithbo.noter.quicknotefragment.onitemaddedhandler;  import android.os.bundle; import android.support.v4.app.fragment; import android.view.contextmenu; import android.view.contextmenu.contextmenuinfo; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.adapterview; import android.widget.adapterview.adaptercontextmenuinfo; import android.widget.listview; import android.widget.simpleadapter; import android.widget.textview; import android.widget.toast;  public class historyfragment extends fragmentbase implements onitemaddedhandler {      listview lv;     list<map<string, string>> planetslist = new arraylist<map<string, string>>();     simpleadapter simpleadpt;      @override     public view oncreateview(layoutinflater inflater, viewgroup container,             bundle savedinstancestate) {         // todo auto-generated method stub         view view = inflater.inflate(r.layout.history, container, false);         initlist();           listview lv = (listview) view.findviewbyid(r.id.listview);         simpleadpt = new simpleadapter(getactivity(), planetslist,                 android.r.layout.simple_list_item_1, new string[] { "planet" },                 new int[] { android.r.id.text1 });          lv.setadapter(simpleadpt);          lv.setonitemclicklistener(new adapterview.onitemclicklistener() {              public void onitemclick(adapterview<?> parentadapter, view view,                     int position, long id) {                  // know view textview can cast                  textview clickedview = (textview) view;                  toast.maketext(                         getactivity(),                         "item id [" + id + "]  - position [" + position                                 + "] - planet [" + clickedview.gettext() + "]",                         toast.length_short).show();             }          });         registerforcontextmenu(lv);          return view;      }      private void initlist() {          // populate planets          planetslist.add(createplanet("planet", "mercury"));         planetslist.add(createplanet("planet", "venus"));         planetslist.add(createplanet("planet", "mars"));         planetslist.add(createplanet("planet", "jupiter"));         planetslist.add(createplanet("planet", "saturn"));         planetslist.add(createplanet("planet", "uranus"));         planetslist.add(createplanet("planet", "neptune"));      }      private hashmap<string, string> createplanet(string key, string name) {          hashmap<string, string> planet = new hashmap<string, string>();          planet.put(key, name);          return planet;      }      // want create context menu when user long click on item      @override     public void oncreatecontextmenu(contextmenu menu, view v,      contextmenuinfo menuinfo) {          super.oncreatecontextmenu(menu, v, menuinfo);          adaptercontextmenuinfo ainfo = (adaptercontextmenuinfo) menuinfo;          // know each row in adapter map          hashmap map = (hashmap) simpleadpt.getitem(ainfo.position);          menu.setheadertitle("options " + map.get("planet"));         menu.add(1, 1, 1, "details");         menu.add(1, 2, 2, "delete");      }      @override       public void onitemadded(object data) {           // add item           string string = string.valueof(data);           toast.maketext(getcontext(), "data: " + string, toast.length_short).show();           planetslist.add(createplanet("planet", string));       }       @override     public void onstart() {           super.onstart();            datamodel.getinstance().setonitemaddedhandler(this);       } } 

this fragmentbase:

   import android.support.v4.app.fragment;     import android.support.v4.app.fragmentactivity;        public class fragmentbase extends fragment {              private fragmentactivity mactivity; // changed fragmentactivity because activity not working, , `navdrawer` fragmentactivity.              public void setcontext(fragmentactivity activity) {                 mactivity = mactivity;             }              public fragmentactivity getcontext() {                 return mactivity;             }     } 

this datamodel:

  import android.util.log;     import com.xxx.xxx.quicknotefragment.onitemaddedhandler;  public class datamodel {      private static datamodel instance;     private static onitemaddedhandler monitemaddhandler;      public static datamodel getinstance() {         if (null == instance) {             instance = new datamodel();         }         return instance;     }      public void setonitemaddedhandler(onitemaddedhandler handler) {         monitemaddhandler = handler;     }      public void additem(object data) {         if (null != monitemaddhandler)             monitemaddhandler.onitemadded(data);         else {             log.i("is context null?", "yes!");         }       } } 

thank you

i suggest use interface , mvc, make code more maintainable.

first need interface:

    public interface onitemaddedhandler {         public void onitemadded(object data);     } 

then, need data model:

    public class datamodel {          private static datamodel instance;         private static onitemaddedhandler monitemaddhandler;          public static datamodel getinstance() {             if (null == instance) {                 instance = new datamodel();             }             return instance;         }          public void setonitemaddedhandler(onitemaddedhandler handler) {             monitemaddhandler = handler;         }          public void additem(object data) {             if (null != monitemaddhandler)                 monitemaddhandler.onitemadded(data);         }     } 

when click button, can add data datamodel:

    object data = null;     datamodel.getinstance().additem(data); 

then, fragmentb implements interface onitemaddedhandler add item

    public class fragmentb implements onitemaddedhandler {          @override         public void onitemadded(object data) {             // add item         }     } 

also, when fragmentb start, should register datamodel:

    public class fragmentb implements onitemaddedhandler {          @override         public void onitemadded(object data) {             // add item         }          @override         protected void onstart() {             super.onstart();              datamodel.getinstance().setonitemaddedhandler(this);         }     } 

you can add datamodel.getinstance().setonitemaddedhandler(this); oncreate method of fragmentb

@override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     datamodel.getinstance().setonitemaddedhandler(this);      // other things } 

update

you can send string simply:

    string data = "some string";     datamodel.getinstance().additem(data); 

then on fragementb

    public class fragmentb implements onitemaddedhandler {          @override         public void onitemadded(object data) {             // send method datamodel.getinstance().additem(data);             string string = string.valueof(data);         }     } 

update

ok. have add datamodel.getinstance().setonitemaddedhandler(this) in oncreateview method, there no need add in onstart() method. can remove whole onstart method.

onstart called on fragment start, not need call in oncreateview. , on onitemadded call when call method datamodel.getinstance().additem(data), not need call in oncreateview neither.

so, can remove code below oncreateview method:

   datamodel.getinstance().setonitemaddedhandler(this);    // remove methods below    // onitemadded(getview());    // onstart(); 

you have fragment there button, can add codes below in clickhandler function:

string data = "some string"; datamodel.getinstance().additem(data); 

update3

i think historyfragment has been detached after when quicknotefragment can add code historyfragment check:

@override public void ondetach() {     super.ondetach();     log.i("test", string.format("ondetach! %s", getactivity() == null)); } 

update4

i think historyfragment , quicknotefragment should has parent class, named fragmentbase:

    public class fragmentbase extends fragment {          private activity mactivity;          public void setcontext(activity activity) {             mactivity = mactivity;         }          public activity getcontext() {             return mactivity;         }     } 

historyfragment , quicknotefragment extends fragmentbase. when switch between them, can call setcontext set activity, like:

private void selectitem(int position) {      fragmentmanager fragmentmanager = getsupportfragmentmanager();      if (position == 0) {         fragment qnfragment = new quicknotefragment();         qnfragment.setcontext(this);          // ...      } else if (position == 1) {         fragment pagerfragment = new remviewpager();         pagerfragment.setcontext(this);          // ...     } } 

now, can non-null activity in historyfragment calling getcontext, can change onitemadded method to:

  @override   public void onitemadded(object data) {       // add item       string string = string.valueof(data);       toast.maketext(getcontext(), "data: " + string, toast.length_short).show();       planetslist.add(createplanet("planet", string));   } 

i hope work.


Comments