android - RecyclerView not populated until SearchView interaction -


i'm facing issue recyclerview, has custom adapter. issue when activity opens, recyclerview empty. when user types on searchview's text field, recyclerview gets populated , stays populated without problems. tried change place of code fix issue, yet no success. i've added current , desired state screenshots below codes. in advance.

addcourseactivity:

public class addcourseactivity extends appcompatactivity{  private recyclerview mrecyclerview; private addcourseadapter madapter; private list<addcourseadapter.addcoursemodel> mmodels; searchview msearchview;  @override protected void oncreate(bundle savedinstance) {     super.oncreate(savedinstance);     setcontentview(r.layout.activity_add_course);     kii.initialize(appconstants.app_id, appconstants.app_key,             appconstants.app_site);     toolbar toolbar = (toolbar) findviewbyid(r.id.toolbar);     setsupportactionbar(toolbar);     getsupportactionbar().setdisplayhomeasupenabled(true);     getsupportactionbar().setdisplayshowhomeenabled(true);     mrecyclerview = (recyclerview) findviewbyid(r.id.addcourserecyclerview);     mrecyclerview.setlayoutmanager(new linearlayoutmanager(this));     string[] courses = new string[]{             "math119",             "enve101",             "chem107",             "chem229",             "phys105",             "math120"};     mmodels = new arraylist<>();     madapter = new addcourseadapter(this, mmodels);     msearchview = (searchview) findviewbyid(r.id.searchview);     msearchview.setonquerytextlistener(new searchview.onquerytextlistener() {         @override         public boolean onquerytextsubmit(string query) {             return false;         }         @override         public boolean onquerytextchange(string newtext) {             final list<addcourseadapter.addcoursemodel> filteredmodellist = filter(mmodels, newtext);             madapter.animateto(filteredmodellist);             mrecyclerview.scrolltoposition(0);             return true;         }     });     (string course: courses) {         mmodels.add(new addcourseadapter.addcoursemodel(course));         mrecyclerview.setadapter(madapter);         madapter.notifydatasetchanged();     } }  private list<addcourseadapter.addcoursemodel> filter(list<addcourseadapter.addcoursemodel> models, string query) {     query = query.tolowercase();     final list<addcourseadapter.addcoursemodel> filteredmodellist = new arraylist<>();     (addcourseadapter.addcoursemodel model: models) {         final string text = model.gettext().tolowercase();         if (text.contains(query)) {             filteredmodellist.add(model);         }     }     return filteredmodellist; } } 

addcourseadapter:

public class addcourseadapter extends recyclerview.adapter<addcourseadapter.addcourseviewholder> { private final layoutinflater minflater; private final list<addcoursemodel> mmodels; kiiuser user; kiiobject object; kiibucket userbucket; context context;  public addcourseadapter(context context, list<addcoursemodel> models) {     minflater = layoutinflater.from(context);     mmodels = new arraylist<>(models); }  @override public addcourseviewholder oncreateviewholder(viewgroup parent, int viewtype) {     context = parent.getcontext();     final view itemview = minflater.inflate(r.layout.list_item_add_course, parent, false);     user = kiiuser.getcurrentuser();     final string username = user.getusername();     userbucket = kii.user().bucket(username);     string id = "mycourses";     object = userbucket.object(id);     return new addcourseviewholder(itemview); }  @override public void onbindviewholder(final addcourseviewholder holder, int position) {     final addcoursemodel model = mmodels.get(position);     holder.bind(model);     holder.addbutton.setonclicklistener(new view.onclicklistener() {         @override         public void onclick(view v) {             final string value = holder.mtextview.gettext().tostring();             object.refresh(new kiiobjectcallback() {                 @override                 public void onrefreshcompleted(int token, @nonnull kiiobject object, exception exception) {                     object.set(value, true);                     object.saveallfields(new kiiobjectcallback() {                         @override                         public void onsavecompleted(int token, kiiobject object, exception exception) {                             toast.maketext(context,                                     "added: " + value,                                     toast.length_short)                                     .show();                         }                     }, false);                 }             });             holder.addbutton.setvisibility(view.gone);             holder.removebutton.setvisibility(view.visible);         }     });     holder.removebutton.setonclicklistener(new view.onclicklistener() {         @override         public void onclick(final view v) {             final string value = holder.mtextview.gettext().tostring();             object.refresh(new kiiobjectcallback() {                 @override                 public void onrefreshcompleted(int token, @nonnull kiiobject object, exception exception) {                     object.set(value, false);                     object.saveallfields(new kiiobjectcallback() {                         @override                         public void onsavecompleted(int token, @nonnull kiiobject object, exception exception) {                             toast.maketext(context,                                     "removed: " + value,                                     toast.length_short)                                     .show();                         }                     }, false);                 }             });              holder.addbutton.setvisibility(view.visible);             holder.removebutton.setvisibility(view.gone);         }     }); }  @override public int getitemcount() {     return mmodels.size(); }  public void animateto(list<addcoursemodel> models) {     applyandanimateremovals(models);     applyandanimateadditions(models);     applyandanimatemoveditems(models); }  private void applyandanimateremovals(list<addcoursemodel> newmodels) {     (int = mmodels.size() - 1; >= 0; i--) {         final addcoursemodel model = mmodels.get(i);         if (!newmodels.contains(model)) {             removeitem(i);         }     } }  private void applyandanimateadditions(list<addcoursemodel> newmodels) {     (int = 0, count = newmodels.size(); < count; i++) {         final addcoursemodel model = newmodels.get(i);         if (!mmodels.contains(model)) {             additem(i, model);         }     } }  private void applyandanimatemoveditems(list<addcoursemodel> newmodels) {     (int toposition = newmodels.size() - 1; toposition >= 0; toposition--) {         final addcoursemodel model = newmodels.get(toposition);         final int fromposition = mmodels.indexof(model);         if (fromposition >= 0 && fromposition != toposition) {             moveitem(fromposition, toposition);         }     } }  public addcoursemodel removeitem(int position) {     final addcoursemodel model = mmodels.remove(position);     notifyitemremoved(position);     return model; }  public void additem(int position, addcoursemodel model) {     mmodels.add(position, model);     notifyiteminserted(position); }  public void moveitem(int fromposition, int toposition) {     final addcoursemodel model = mmodels.remove(fromposition);     mmodels.add(toposition, model);     notifyitemmoved(fromposition, toposition); }  public class addcourseviewholder extends recyclerview.viewholder {     private final textview mtextview;     private final imagebutton addbutton;     private final imagebutton removebutton;      public addcourseviewholder(view itemview) {         super(itemview);         mtextview = (textview) itemview.findviewbyid(r.id.addcoursetv);         addbutton = (imagebutton) itemview.findviewbyid(r.id.addbutton);         removebutton = (imagebutton) itemview.findviewbyid(r.id.removebutton);     }      public void bind(addcoursemodel model) {         mtextview.settext(model.gettext());     } }  public static class addcoursemodel {    private final string mtext;     public addcoursemodel(string text) {        this.mtext = text;    }     public string gettext() {        return mtext;    } } } 

current initial state:

desired initial state:

the case in adapter constructor

public addcourseadapter(context context, list<addcoursemodel> models) {     minflater = layoutinflater.from(context);     mmodels = new arraylist<>(models); } 

you create new arraylist populated models list (which empty @ moment). later populate initial models arraylist, not 1 created in adapter.

you can:

a) move

for (string course: courses) {         mmodels.add(new addcourseadapter.addcoursemodel(course));         mrecyclerview.setadapter(madapter);         madapter.notifydatasetchanged();     } 

between lines

mmodels = new arraylist<>(); madapter = new addcourseadapter(this, mmodels); 

making in looking

mmodels = new arraylist<>();  (string course: courses) {   mmodels.add(new addcourseadapter.addcoursemodel(course)); } madapter = new addcourseadapter(this, mmodels); mrecyclerview.setadapter(madapter); 

or

b) rewrite adapter constructor

public addcourseadapter(context context, list<addcoursemodel> models) {         minflater = layoutinflater.from(context);         mmodels = models;     } 

Comments