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(); } } }
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
Post a Comment