java - Android ListView not refreshing after dataset changed, though I have used the Adapter.notifyDataSetChanged() -


i know similar questions had been asked here couple of times, none of them me problem, have ask again.

what have app has fragment holds listview in main activity , used pullablelistview when drag listview up, trigger onloadmore() callback method load more data server. once data loaded, data saved sqlitedb , used listview show updated data.

the pullablelistviewfragment.java:

public class pullablelistviewfragment extends fragment implements     onitemclicklistener {  private listview listview; private pulltorefreshlayout ptrl;  private missiondb mmissiondb; private list<missionentity> mdata;  private missionlistadapter madapter;  /**  * specify exact mission displayed in missiondetailactivity  */ private int mindexofmission;  @override public view oncreateview(layoutinflater inflater, viewgroup container,         bundle savedinstancestate) {     view pullablelayout = inflater.inflate(r.layout.pullable_layout, container, false);     listview = (listview) pullablelayout.findviewbyid(r.id.content_view);     listview.setdivider(null);     ptrl = (pulltorefreshlayout) pullablelayout.findviewbyid(r.id.refresh_view);     ptrl.setonrefreshlistener(new refreshlistener());     loaddata();      log.d(constants.log_tag, "oncreateview called pullablelistviewfragment");      return pullablelayout; }  /**  * initialise listview  */ @override public void onactivitycreated(bundle savedinstancestate) {     super.onactivitycreated(savedinstancestate);     madapter = new missionlistadapter(getactivity(), mdata);     listview.setadapter(madapter);     listview.setonitemclicklistener(this);     madapter.notifydatasetchanged();     log.d(constants.log_tag, "onactivitycreated called pullablelistviewfragment"); }  /**  * load data db  */ private void loaddata() {     mdata = new arraylist<>();     mmissiondb = missiondb.getinstance(myapplication.getcontext());     mdata = mmissiondb.loadmission(); }  /**  * onitemclick event  */ @override public void onitemclick(adapterview<?> parent, view view, int position,         long id) {     intent intent = new intent(getactivity(), missiondetailactivity.class);     mindexofmission = mdata.get((int) id).getid();     intent.putextra("position", mindexofmission);     startactivity(intent); }  } 

and refreshlistener.java:

public class refreshlistener implements pulltorefreshlayout.onrefreshlistener {  private missiondb mmissiondb = missiondb.getinstance(myapplication.getcontext());  @override public void onloadmore(final pulltorefreshlayout pulltorefreshlayout) {     // loadmore     new handler() {          @override         public void handlemessage(message msg) {              /** when drag up, load more mission older , not out of date */             mmissiondb.open();             int id = mmissiondb.getmaxorminid("min");             final jsonobject oldmission = new jsonobject();             try {                 oldmission.put("platform", "1");                 oldmission.put("more", 0);                 oldmission.put("id", id);                 oldmission.put("size", 1);             } catch (jsonexception e) {                 e.printstacktrace();             }              thread t = new thread(new runnable() {                  @override                 public void run() {                     httprequest.sendhttprequest(constants.pullordrag_to_load_mission_url, oldmission, new httpcallbacklistener() {                          @override                         public void onfinish(string response) {                             missionentity mmission = new missionentity();                              /** save new mission mission database */                             try {                                 jsonobject jsonobject = new jsonobject(response);                                 jsonarray missionlist = jsonobject.getjsonarray("tasklist");                                 (int = 0; < missionlist.length(); i++) {                                     jsonobject mission = missionlist.getjsonobject(i);                                     mmission.setid(mission.getint("id"));                                     mmission.setdownloadurl(mission.getstring("apppath"));                                     mmission.setcreatetime(mission.getstring("taskid"));                                     mmission.setimageurl(mission.getstring("appimg"));                                     mmission.settitlename(mission.getstring("appname"));                                     mmission.setremaintime("remain: 1d 11h 23m 36s");                                     mmission.setparticipant("135");                                     mmission.setcreator("google");                                     mmission.setrequirement(mission.getstring("description"));                                     mmission.setrewards("todo");                                     mmission.setattention("todo");                                     mmission.setvaliddate(mission.getstring("deadline"));                                     mmission.setaccepted("0");                                     mmission.setcollected("0");                                     mmission.setaccomplished("0");                                     mmissiondb.savemission(mmission);                                 }                             } catch (jsonexception e) {                                 e.printstacktrace();                             }                         }                          @override                         public void onerror(exception e) {                             e.printstacktrace();                             log.e(constants.log_tag, "error while loading more");                         }                     });                 }             });              try {                 t.start();                 t.join();             } catch (interruptedexception e) {                 e.printstacktrace();             }              pulltorefreshlayout.loadmorefinish(pulltorefreshlayout.succeed);              //==================update 1==================             listview list = (listview) pulltorefreshlayout.findviewbyid(r.id.content_view);             list<missionentity> missionlist = mmissiondb.loadmission();             log.d(constants.log_tag, "mission size" + missionlist.size());             missionlistadapter adapter = (missionlistadapter) list.getadapter();             adapter.setdata(missionlist);             adapter.notifydatasetchanged();             list.setadapter(adapter);             //==================update 1==================         }     }.sendemptymessagedelayed(0, 1000); }  } 

the pulltorefreshlayout custom relativelayout defined inner interface onrefreshlistener called once onloadmore() callback method called.

the listview use in fragment pullablelistview implemented pullable interface can drag up.

my pullable.java:

public interface pullable {     /**      * if pull not needed, set canpullup false      *       * @return true if view can pull      */     boolean canpullup(); } 

this fragment's layout.xml:

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"           android:layout_width="match_parent"           android:layout_height="match_parent"           android:background="#f2f2f2"           android:orientation="vertical">  <view     android:layout_width="match_parent"     android:layout_height="5dp" />  <pulltorefresh.pulltorefreshlayout     android:id="@+id/refresh_view"     android:layout_marginleft="8dp"     android:layout_marginright="8dp"     android:layout_width="match_parent"     android:layout_height="match_parent">      <include layout="@layout/refresh_head"/>      <!-- supports view implemented pullable interface -->     <pulltorefresh.pullablelistview         android:id="@+id/content_view"         android:layout_width="match_parent"         android:layout_height="match_parent"/>      <include layout="@layout/load_more"/>  </pulltorefresh.pulltorefreshlayout>  </linearlayout> 

the problem when data in sqlitedb changed after onloadmore() method, listview in fragment doesn't refresh unless navigate fragment within same main activity , navigate back.

i tired ways can find here , none of them help.

could tell me how can make listview refresh when data in sqlitedb changed.

[update 1] i've added code in onloadmore() callback, size of data remains same after data server, think problem why listvie not refreshing, what's interesting if put thread.sleep(500) before mmission.loadmission() size of data correct , fine. idea why?

in onloadmore method, load data , save database. after load data, should update data source of adapter , call adapter.notifydatasetchanged() refresh listview. or can notify fragment reload data database.


Comments

Popular posts from this blog

how to insert data php javascript mysql with multiple array session 2 -

multithreading - Exception in Application constructor -

windows - CertCreateCertificateContext returns CRYPT_E_ASN1_BADTAG / 8009310b -