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
Post a Comment