our mainactivity's tablayout instantiates fragment, has recyclerview each individual item being cardview. data retrieved backend server , updates adapter. adapter binds viewholder , viewholder should update each cardview's widgets server's data.
this vision viewholder isn't updating cardview's textview widget. still displays default hardcoded value layout xml.
to test, added breakpoints , log statements within adapter , viewholder , stepped through. looked fine.
everywhere put log statement, logged correct data.
if data binding seems fine , there no other errors why doesn't viewholder's bindmodel method update textview?
public class modelsfragment extends fragment { private final string api_key = "insert api key here"; private static final string arg_category = "model_category"; private string mcategory; private recyclerview mmodelrecyclerview; private modeladapter mmodeladapter; private list<model> mmodels; public static fragment newinstance(string category) { bundle args = new bundle(); args.putstring(arg_category, category); modelsfragment modelsfragment = new modelsfragment(); modelsfragment.setarguments(args); return modelsfragment; } @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); mcategory = getarguments().getstring(arg_category); final progressdialog progressdialog = new progressdialog(getactivity(), r.style.progressdialogtheme); progressdialog.setcancelable(false); progressdialog.setprogressstyle(android.r.style.widget_progressbar); progressdialog.show(); edmundsservice service = edmundsservicegenerator.createservice(edmundsservice.class); map<string, string> options = new hashmap<>(); options.put("state", "new"); options.put("year", "2016"); options.put("view", "basic"); options.put("api_key", api_key); if (mcategory != null) { options.put("category", mcategory); } // use hash map query backend api server request. call<models> call = service.getmodels(options); call.enqueue(new callback<models>() { @override public void onresponse(call<models> call, response<models> response) { if (response.issuccessful()) { mmodels = response.body().getmodels(); progressdialog.dismiss(); updateui(); log.i("get status", "successfully retrieved data"); log.i("get status", response.body().getmodelscount().tostring()); } else { log.i("get status", "failed retrieve data"); } } @override public void onfailure(call<models> call, throwable t) { log.e("error retrieving data", t.getmessage()); } }); } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { mmodelrecyclerview = (recyclerview) inflater.inflate(r.layout.fragment_models, container, false); mmodelrecyclerview.sethasfixedsize(true); mmodelrecyclerview.setlayoutmanager(new linearlayoutmanager(getactivity())); updateui(); return mmodelrecyclerview; } private void updateui() { mmodeladapter = new modeladapter(mmodels); mmodelrecyclerview.setadapter(mmodeladapter); } public class modelholder extends recyclerview.viewholder { private model model; private textview mname; public modelholder(layoutinflater inflater, viewgroup parent) { super(inflater.inflate(r.layout.fragment_models_card_view_item, parent, false)); view view = inflater.inflate(r.layout.fragment_models_card_view_item, parent, false); mname = (textview) view.findviewbyid(r.id.card_view_name); } public void bindmodel(model model) { this.model = model; // if statement added prevent null object reference errors. if (this.model != null) { // data correctly logged. log.i("inside if statement", this.model.getname()); mname.settext(this.model.getname()); // why doesn't update? } // data correctly logged. log.i("bound model", string.valueof(this.model.getname())); } } public class modeladapter extends recyclerview.adapter<modelholder> { // set number of cards in recycler view. private list<model> models; public modeladapter(list<model> models) { this.models = models; } @override public modelholder oncreateviewholder(viewgroup parent, int viewtype) { return new modelholder(layoutinflater.from(parent.getcontext()), parent); } @override public void onbindviewholder(modelholder holder, int position) { // our list of models, 1 model position , bind our view holder class. model model = models.get(position); log.i("just prior binding", model.getname()); holder.bindmodel(model); } @override public int getitemcount() { return models == null ? 0 : models.size(); } } }
you inflating 2 views in modelholder
public modelholder(layoutinflater inflater, viewgroup parent) { super(inflater.inflate(r.layout.fragment_models_card_view_item, parent, false)); view view = inflater.inflate(r.layout.fragment_models_card_view_item, parent, false); mname = (textview) view.findviewbyid(r.id.card_view_name); }
the view pass super call view displaying. view inflating after not being displayed (and using find mname
) why aren't seeing changes. should inflating 1 view , passing modelholder
can search r.id.card_view_name
view.
ex.
public modelholder(view view) { super(view); mname = (textview) view.findviewbyid(r.id.card_view_name); }
and in adapters oncreateviewholder
@override public modelholder oncreateviewholder(viewgroup parent, int viewtype) { view view = layoutinflater.from(parent.getcontext()).inflate(r.layout.fragment_models_card_view_item, parent, false); return new modelholder(view); }