i built fragment use data in web service call display gridview list. has .5 second of delay grab data , display gridview on xml. issue everytime come other pages or reorient view, delay happens. don't know missing should system save last view in memory display before gets real data web service whenever come other pages?
public class fragment_grid_room extends fragment{ private static final string tag = fragment_grid_room.class.getname(); public fragment_grid_room() { } @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // add line in order fragment handle menu events. setretaininstance(true); sethasoptionsmenu(true); } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { //start async task display rooms displaygridrooms gridrooms = new displaygridrooms(); gridrooms.execute(new string[] { "params" }); view rootview = inflater.inflate(r.layout.fragment_roomgrid, container, false); //rootview.findviewbyid(r.id.loadingpanel).setvisibility(view.visible); //add current date textview daytv = (textview) rootview.findviewbyid(r.id.currentdate); simpledateformat sdf = new simpledateformat("eee, mmm d, yyyy"); date = new date(); string strdate = sdf.format(now); log.d(tag, "*****strdate"+strdate); daytv.settext(strdate); return rootview; } //async task display rooms private class displaygridrooms extends asynctask<string, void, jsonarray> { jsonarray jsonarrayrooms; @override protected jsonarray doinbackground(string... url) { string email = getresources().getstring(r.string.temp_login); string pwd = getresources().getstring(r.string.temp_pwd); string username = "apark@anexinet.com"; webserviceroom wsroom = new webserviceroom(); jsonarrayrooms = wsroom.getroomlist(email, pwd, username); //system.out.println("222******returning jsonroom with: "+jsonroom.length()); return jsonarrayrooms; } @override protected void onpostexecute(jsonarray jsonarrayrooms) { arraylist<roomgrid> room_list = new arraylist<roomgrid>(); int totalnumrooms=jsonarrayrooms.length(); int availnum=0; (int = 0; < jsonarrayrooms.length(); i++) { roomgrid roomobject = new roomgrid(); try { jsonobject jsonroom = jsonarrayrooms.getjsonobject(i); string[] temp = jsonroom.getstring("roomname").split("-"); string[] temp2 = temp[1].split("\\("); roomobject.setroomname(temp2[0].trim()); string roomstat = jsonroom.getstring("statustext"); roomobject.setstatus(roomstat); room_list.add(roomobject); if(roomstat.tolowercase().contains("available")){ //count available rooms availnum+=1; }; } catch (exception ex) { log.e(tag, "json array exception rooms:" + ex); } } final gridview gridview = (gridview) getactivity().findviewbyid(r.id.gridview_room); //set availability bar textview avalbar = (textview) getactivity().findviewbyid(r.id.availablebar); string availbilitytext = "available "+availnum+" of "+totalnumrooms; avalbar.settext(availbilitytext); window window = getactivity().getwindow(); view v = window.getdecorview(); imagebutton imagegrid = (imagebutton) v.findviewbyid(r.id.gridbutton); imagegrid.setvisibility(view.gone); display display = getactivity().getwindowmanager().getdefaultdisplay(); point size = new point(); display.getsize(size); int width = size.x; int height = size.y; int numcolfinal = 1; if (width > 350) { double numcol = width / 350; numcolfinal = (int) numcol; } gridview.setnumcolumns(numcolfinal); log.d(tag, "screen width, numcolfinal=" + width + "," + numcolfinal); // getactivity().findviewbyid(r.id.loadingpanel).setvisibility(view.gone); gridview.setadapter(new customadaptorroomgrid(getactivity(), room_list)); //when list clicked, move detail page gridview.setonitemclicklistener(new adapterview.onitemclicklistener() { @override public void onitemclick(adapterview<?> adapterview, view view, int position, long l) { object o = gridview.getitematposition(position); roomgrid fullobject = (roomgrid)o; string roomname = fullobject.getroomname(); intent intent = new intent(getactivity(), roomtimeslotactivity.class) .putextra(intent.extra_text, roomname); startactivity(intent); } }); } } }
one way fix issue storing data in shared preferences every time close fragment.
first little improvement. can move code below onpostexecute() in doinbackground(). , rather return jsonarray in onpostexecute() can return list of roomgrid
list<roomgrid> room_list = new arraylist<roomgrid>(); int totalnumrooms=jsonarrayrooms.length(); int availnum=0; (int = 0; < jsonarrayrooms.length(); i++) { roomgrid roomobject = new roomgrid(); try { jsonobject jsonroom = jsonarrayrooms.getjsonobject(i); string[] temp = jsonroom.getstring("roomname").split("-"); string[] temp2 = temp[1].split("\\("); roomobject.setroomname(temp2[0].trim()); string roomstat = jsonroom.getstring("statustext"); roomobject.setstatus(roomstat); room_list.add(roomobject); if(roomstat.tolowercase().contains("available")){ //count available rooms availnum+=1; }; } catch (exception ex) { log.e(tag, "json array exception rooms:" + ex); } } in class roomgrid (the 1 add in list), add
- method
tojson()- createsjsonobjectinstance representing data - static method
public static roomgrid from(jsonobject json)- create , returnroomgridinstance (or null if json null, empty, etc)
in customadaptorroomgrid add - getitems() return list of roomgrid supplied when creating adapter
in fragment ondestroyview() add:
customadaptorroomgrid adapter = (customadaptorroomgrid) gridview.getadapter(); int length = adapter != null && adapter.getitems() != null ? adapter.getitems().size() : 0; if (length > 0) { // create jsonarray list jsonarray array = new jsonarray(); (roomgrid item : adapter.getitems()) { array.put(item.tojson(); } // add value in preferences sharedpreferences prefs = ...; prefs.edit().put("your_key", array.tostring()).apply(); } and in fragment onviewcreated() check array shared preferences , revert list of items , supply them adapter.
then engage task download , refresh whatever need.
Comments
Post a Comment