Here is my implementation
Java code for custom switch:
public class CustomSwitch extends SwitchCompat { private OnCheckedChangeListener mListener = null; public CustomSwitch(Context context) { super(context); } public CustomSwitch(Context context, AttributeSet attrs) { super(context, attrs); } public CustomSwitch(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void setOnCheckedChangeListener(@Nullable OnCheckedChangeListener listener) { if(listener != null && this.mListener != listener) { this.mListener = listener; } super.setOnCheckedChangeListener(listener); } public void setCheckedSilently(boolean checked){ this.setOnCheckedChangeListener(null); this.setChecked(checked); this.setOnCheckedChangeListener(mListener); }}
Equivalent Kotlin code:
class CustomSwitch : SwitchCompat { private var mListener: CompoundButton.OnCheckedChangeListener? = null constructor(context: Context) : super(context) {} constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {} constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} override fun setOnCheckedChangeListener(@Nullable listener: CompoundButton.OnCheckedChangeListener?) { if (listener != null && this.mListener != listener) { this.mListener = listener } super.setOnCheckedChangeListener(listener) } fun setCheckedSilently(checked: Boolean) { this.setOnCheckedChangeListener(null) this.isChecked = checked this.setOnCheckedChangeListener(mListener) }}
To change the state of a switch without starting a listener, use:
swSelection.setCheckedSilently(contact.isSelected)
You can track status changes as usual:
swSelection.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
In Kotlin:
swSelection.setOnCheckedChangeListener{buttonView, isChecked -> run { contact.isSelected = isChecked }}
thilina Kj Sep 14 '18 at 12:32 2018-09-14 12:32
source share