android - Switch Widget - onCheckedChanged triggers when setting values in ArrayAdapter -


i have listview switch widget per listview item, problem having when set value in arrayadapter setoncheckedchangelistener triggered. how can set value in adapter without triggering setoncheckedchangelistener? have found similar question here not work me. below arrayadapter code.

public class alarmsadapter extends arrayadapter<alarms> {  private list<alarms> alarmslist; private context context;  private contactdetailsfragment cdfragment;  public alarmsadapter(context context, int textviewresourceid, list<alarms> alarms) {     super(context, textviewresourceid, objects);     this.context=context;     alarmslist=alarms; }  @override public view getview(int position, view convertview, viewgroup parent) {      final alarms alarm = alarmslist.get(position);      view view = convertview;     viewholder holder = null;      if( view == null ) {         layoutinflater vi = (layoutinflater)context.getsystemservice(context.layout_inflater_service);         view = vi.inflate(r.layout.alarm_row, null);          holder = new viewholder();         holder.alarmlabel = (textview) view.findviewbyid(r.id.alarmlabel);         holder.alarmdate = (textview) view.findviewbyid(r.id.alarmdate);         holder.alarmtime = (textview) view.findviewbyid(r.id.alarmtime);         holder.alarmenabled = (switch) view.findviewbyid(r.id.alarmenabled);          view.settag(holder);     }     else     {         holder = (viewholder) view.gettag();     }      if(alarm != null) {         int alarmid = alarm.getalarmday();         holder.alarmlabel.settext( string.valueof(alarmid));          // alarm date time         long mdatetime = alarm.getalarmtime();         date ndate = new date(mdatetime);          dateformat dateformat = new simpledateformat("mmm d, yyyy");         dateformat timeformat = new simpledateformat("hh:mm a");          holder.alarmdate.settext( dateformat.format(ndate) );         holder.alarmtime.settext( timeformat.format(ndate));         holder.alarmenabled.setchecked((alarm.getison() == 1) ? true : false);         holder.alarmenabled.settag(alarm.get_uid());          holder.alarmenabled.setoncheckedchangelistener(new compoundbutton.oncheckedchangelistener() {             public void oncheckedchanged(compoundbutton buttonview, boolean ischecked) {                 alarm.setison( (ischecked) ? 1:0 );                 cdfragment.addcanceledalarm(alarm);             }         });     }     return view; }  class viewholder {     textview alarmlabel;     textview alarmdate;     textview alarmtime;     switch alarmenabled; }  public void setcdfragment(contactdetailsfragment cdfragment) {     this.cdfragment = cdfragment; } 

}

there several ways how deal such situation.

first , easiest way remove oncheckedchangelistener each time before call setchecked code.

holder.alarmtime.settext(timeformat.format(ndate));  // here remove listener, won't triggered holder.alarmenabled.setoncheckedchangelistener(null);  holder.alarmenabled.setchecked(alarm.getison() == 1); holder.alarmenabled.settag(alarm.get_uid()); holder.alarmenabled.setoncheckedchangelistener(... 

second way add code oncheckedchangelistener verify if new state different current state of switch. code example:

holder.alarmenabled.setoncheckedchangelistener(new compoundbutton.oncheckedchangelistener() {     public void oncheckedchanged(compoundbutton buttonview, boolean ischecked) {         if (alarm.getison() != (ischecked ? 1 : 0)) {             // code executed if new state             // of switch different current state             alarm.setison( (ischecked) ? 1 : 0);             cdfragment.addcanceledalarm(alarm);         }     } }); 

third way introduce kind of flag, indicates whether switch state changed user or code. in listener ignore cases when call setchecked explicitly code.


Comments

Popular posts from this blog

javascript - how to protect a flash video from refresh? -

android - Associate same looper with different threads -

visual studio 2010 - Connect to informix database windows form application -