java - Android: Checkbox in listview (how to create OnCheckedChangeListener in Adapter) -


i'm creating to-do list application , have question regarding using checkboxes , listeners in list adapter. single row in listview contains 3 textviews , 1 checkbox. want change background of single row when user "check" checkbox. have read should put checkbox listener in adapter class , did it. problem - when add few rows listview , left checkbox unchecked of them works fine, when add row, check checkbox , try add 1 error

java.lang.nullpointerexception: attempt invoke virtual method 'void android.view.view.setbackgroundcolor(int)' on null object reference

below code of adapter. thank advice. i'm starting android programming thank understanding in advance.

public class todoadapter extends arrayadapter<todotask> {   arraylist<todotask> objects; context context; int resource;  public todoadapter(@nonnull context context, @layoutres int resource, @nonnull arraylist<todotask> objects) {     super(context, resource, objects);     this.objects = objects;     this.context = context;     this.resource = resource; }  @override public view getview(final int position, view convertview, final viewgroup parent) {     view view = convertview;     todoholder todoholder = null;      if (view == null) {         layoutinflater layoutinflater = (layoutinflater) context.getsystemservice(context.layout_inflater_service);         view = layoutinflater.inflate(r.layout.row, parent, false);          todoholder = new todoholder();         todoholder.rowtitle = (textview) view.findviewbyid(r.id.rowtitle);         todoholder.rowdesc = (textview) view.findviewbyid(r.id.rowdesc);         todoholder.rowdate = (textview) view.findviewbyid(r.id.rowdate);         todoholder.rowisdone = (checkbox) view.findviewbyid(r.id.rowcheckboxdone);          todoholder.rowisdone.setoncheckedchangelistener(new compoundbutton.oncheckedchangelistener() {             @override             public void oncheckedchanged(compoundbutton compoundbutton, boolean checked) {                 if(checked){                     parent.getchildat(position).setbackgroundcolor(color.parsecolor("#8fe370"));                 }                 else                     parent.getchildat(position).setbackgroundcolor(color.white);             }         });          view.settag(todoholder);     } else {         todoholder = (todoholder) view.gettag();     }      todotask object = objects.get(position);     todoholder.rowtitle.settext(object.gettitle());     todoholder.rowdesc.settext(object.getdescription());     todoholder.rowdate.settext(object.getdate());     todoholder.rowisdone.setchecked(object.getdone());      return view; }  static class todoholder {     textview rowtitle;     textview rowdesc;     textview rowdate;     checkbox rowisdone; } } 

below mainactivity class details of single row element "addtodotask" class.

public class mainactivity extends appcompatactivity { private final int requestcode = 1; arraylist<todotask> lista = new arraylist<>(); todoadapter adapter = null;  @override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setcontentview(r.layout.activity_main);     button button = (button) findviewbyid(r.id.buttonadd);     listview listview = (listview) findviewbyid(r.id.listview);      adapter = new todoadapter(this, r.layout.row, lista);     listview.setadapter(adapter);      button.setonclicklistener(new view.onclicklistener() {         @override         public void onclick(view view) {             intent intent = new intent(getapplicationcontext(), addtodotask.class);             startactivityforresult(intent, requestcode);         }     });  }  @override protected void onactivityresult(int requestcode, int resultcode, intent data) {     super.onactivityresult(requestcode, resultcode, data);      string title, description, date;     boolean isdone;      if (requestcode == 1) {         if (null != data) {             title = data.getstringextra("title");             description = data.getstringextra("description");             date = data.getstringextra("date");             isdone = data.getbooleanextra("done", false);              lista.add(new todotask(title, description, date, isdone));             adapter.notifydatasetchanged();         }     } } 

} enter image description here

public class todoadapter extends arrayadapter<todotask> {     private arraylist<todotask> objects;     private context context;     private int resource;     private sparsebooleanarray checkedpositions = new sparsebooleanarray();      public todoadapter(@nonnull context context, @layoutres int resource, @nonnull arraylist<todotask> objects) {         super(context, resource, objects);         this.objects = objects;         this.context = context;         this.resource = resource;     }      @override     public view getview(int position, view convertview, viewgroup parent) {         todoholder todoholder;         if (convertview == null) {             layoutinflater layoutinflater = layoutinflater.from(context);             convertview = layoutinflater.inflate(r.layout.row, parent, false);             todoholder = new todoholder();             todoholder.rowtitle = (textview) convertview.findviewbyid(r.id.rowtitle);             todoholder.rowdesc = (textview) convertview.findviewbyid(r.id.rowdesc);             todoholder.rowdate = (textview) convertview.findviewbyid(r.id.rowdate);             todoholder.rowisdone = (checkbox) convertview.findviewbyid(r.id.rowcheckboxdone);             convertview.settag(todoholder);         } else {             todoholder = (todoholder) convertview.gettag();         }         todoholder.rowtitle.settag(position);         todoholder.rowisdone.settag(convertview);         todoholder.rowisdone.setoncheckedchangelistener(new compoundbutton.oncheckedchangelistener() {             @override             public void oncheckedchanged(compoundbutton compoundbutton, boolean checked) {                 view view = (view) compoundbutton.gettag();                 textview title = (textview) view.findviewbyid(r.id.rowtitle);                 int pos = (int) title.gettag();                 if (checked) {                     checkedpositions.put(pos, true);                     view.setbackgroundcolor(color.parsecolor("#8fe370"));                 } else {                     checkedpositions.put(pos, false);                     view.setbackgroundcolor(color.white);                 }             }         });         todotask object = objects.get(position);         todoholder.rowtitle.settext(object.gettitle());         todoholder.rowdesc.settext(object.getdescription());         todoholder.rowdate.settext(object.getdate());         todoholder.rowisdone.setchecked(object.getdone() || checkedpositions.get(position));         return convertview;     }      private class todoholder {         private textview rowtitle;         private textview rowdesc;         private textview rowdate;         private checkbox rowisdone;     } } 

Comments

Popular posts from this blog

ubuntu - PHP script to find files of certain extensions in a directory, returns populated array when run in browser, but empty array when run from terminal -

php - How can i create a user dashboard -

javascript - How to detect toggling of the fullscreen-toolbar in jQuery Mobile? -