java - RecyclerView is drawn before its data set is updated -


i have fragment in have recyclerview:

public class alarmlistfragment extends fragment{      public alarmlistadapter alarmlistadapter;     recyclerview recyclerviewalarms;      public alarmlistfragment() { }      @override     public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) {         view rootview = inflater.inflate(r.layout.fragment_alarm_list, container, false);          recyclerviewalarms = (recyclerview) rootview.findviewbyid(r.id.fragment_alarm_list_card_list);         recyclerviewalarms.sethasfixedsize(true); // performance!         linearlayoutmanager llm = new linearlayoutmanager(getactivity());         recyclerviewalarms.setlayoutmanager(llm);         alarmlistadapter = new alarmlistadapter(getactivity());         recyclerviewalarms.setadapter(alarmlistadapter);          return rootview;     } 

it uses following adapter:

public class alarmlistadapter extends recyclerview.adapter<alarmlistviewholder> {  private list<alarmmodel> alarmmodeldataset; private context context;  public alarmlistadapter(context context) {     this.alarmmodeldataset = alarmmodel.listall(alarmmodel.class);     this.context = context; }  @override public alarmlistviewholder oncreateviewholder(viewgroup parent, int viewtype) {     layoutinflater inflater = layoutinflater.from(parent.getcontext());     view view = inflater.inflate(r.layout.alarm_list_card, parent, false);     return new alarmlistviewholder(view); }  @override public int getitemcount() {     return (int) alarmmodel.count(alarmmodel.class, null, null); }  @override public void onbindviewholder(alarmlistviewholder holder, int position) {     // todo wait here until alarmmodel added dataset     alarmmodel alarmmodel = alarmmodeldataset.get(position);     *** update gui stuff ***     if (alarmmodel.isenabled()) {         *** update gui stuff ***     }     if (alarmmodel.isrepeatweekly()) {         *** update gui stuff ***     } else {         *** update gui stuff ***     }     if (!alarmmodel.isenabled()){         *** update gui stuff ***     } }  public list<alarmmodel> getdataset(){     return alarmmodeldataset; }  public int getindex(alarmmodel alarmmodel){     (alarmmodel _item : alarmmodeldataset){         if (_item.getid().equals(alarmmodel.getid())){             return alarmmodeldataset.indexof(_item);         }     }     return -1; }  public void addorupdatealarm(alarmmodel alarmmodel){     int position = getindex(alarmmodel);     if (position >= 0) {         updatealarm(alarmmodel, position);     } else {         addalarm(alarmmodel);     } }  private void addalarm(alarmmodel alarmmodel){     alarmmodeldataset.add(alarmmodel);     notifyiteminserted(alarmmodeldataset.size() - 1); }  private void updatealarm(alarmmodel alarmmodel, int position){     alarmmodeldataset.set(getindex(alarmmodel), alarmmodel);     notifyitemchanged(position); }  public void deletealarm(alarmmodel alarmmodel) {     alarmmodel.setisenabled(false);     alarmmanagerbroadcastreceiver.setalarms(context);     int position = getindex(alarmmodel);     alarmmodeldataset.remove(position); // deletes out of class internal list     notifyitemremoved(position); // notifies list fragment of deletion }  public void enableordisablealarm(int position){     alarmmodel alarmmodel = alarmmodeldataset.get(position);     alarmmodel.setisenabled(!alarmmodel.isenabled());     notifyitemchanged(position); } 

every alarmmodel saved in database working fine removed code database. fragment first code snippet uses startactivityforresult open activity allows creation of new alarm stored in alarmmodel. new alarmmodel saved data base , id returned fragment code

intent intent = new intent(); intent.putextra("id", alarmdetails.getid()); intent.putextra("delete", false); setresult(result_ok, intent); supportfinishaftertransition(); 

this result received onactivityresult method of fragment:

public void onactivityresult(int requestcode, int resultcode, intent data) {     super.onactivityresult(requestcode, resultcode, data);      if (resultcode == activity.result_ok && requestcode == request_code_add_alarm_id) {         long id = data.getlongextra("id", -7777);          if (data.getbooleanextra("delete", false)) { // delete             alarmlistadapter.deletealarm(alarmmodel.findbyid(alarmmodel.class, id));         } else { // add or update             alarmlistadapter.addorupdatealarm(alarmmodel.findbyid(alarmmodel.class, id));         }     } } 

after code able describe problem:

before code reaches addorupdate method, adapter's onbindviewholder method called , produces indexoutofboundsexception because alarmmodel alarmmodel = alarmmodeldataset.get(position); added alarmmodel wants drawn not yet added dataset.

everything works fine (although app becomes pretty slow) when recyclerview has ~10+ items since onbindviewholder called every other item first , after calculating 9 other items addorupdate method has finished.

is there fatal mistake made or method did not find yet, me? thought using 2 threads , letting 1 wait until other 1 has finished unsure how since allready know should never block ui-thread.

edit 1

in attempt make add, update , delete method in adapter static removed list alarmmodeldatasetcompletely , queried data base every time instead. although initial plan did not work out, noticed solved problem making methods slow worked fine again. since not real solution bad coding works not satisfied it...

thanks reading long question/problem

tafelbomber


Comments

Popular posts from this blog

javascript - Bootstrap Popover: iOS Safari strange behaviour -

Website Login Issue developed in magento -

Can the constants be defined inside a model file of a framework in PHP? -