android - ViewHolder's data has been bound but why aren't the widgets updating? -


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); }