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