package com.mikepenz.materialdrawer.model; import androidx.annotation.LayoutRes; import androidx.appcompat.widget.SwitchCompat; import android.view.View; import android.widget.CompoundButton; import com.mikepenz.materialdrawer.Drawer; import com.mikepenz.materialdrawer.R; import com.mikepenz.materialdrawer.interfaces.OnCheckedChangeListener; import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; import java.util.List; /** * Created by mikepenz on 03.02.15. */ public abstract class AbstractSwitchableDrawerItem<Item extends AbstractSwitchableDrawerItem> extends BaseDescribeableDrawerItem<Item, AbstractSwitchableDrawerItem.ViewHolder> { private boolean switchEnabled = true; private boolean checked = false; private OnCheckedChangeListener onCheckedChangeListener = null; public Item withChecked(boolean checked) { this.checked = checked; return (Item) this; } public Item withSwitchEnabled(boolean switchEnabled) { this.switchEnabled = switchEnabled; return (Item) this; } public Item withOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) { this.onCheckedChangeListener = onCheckedChangeListener; return (Item) this; } public Item withCheckable(boolean checkable) { return withSelectable(checkable); } public boolean isChecked() { return checked; } public boolean isSwitchEnabled() { return switchEnabled; } public OnCheckedChangeListener getOnCheckedChangeListener() { return onCheckedChangeListener; } @Override public int getType() { return R.id.material_drawer_item_primary_switch; } @Override @LayoutRes public int getLayoutRes() { return R.layout.material_drawer_item_switch; } @Override public void bindView(final ViewHolder viewHolder, List payloads) { super.bindView(viewHolder, payloads); //bind the basic view parts bindViewHelper(viewHolder); //handle the switch viewHolder.switchView.setOnCheckedChangeListener(null); viewHolder.switchView.setChecked(checked); viewHolder.switchView.setOnCheckedChangeListener(checkedChangeListener); viewHolder.switchView.setEnabled(switchEnabled); //add a onDrawerItemClickListener here to be able to check / uncheck if the drawerItem can't be selected withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { @Override public boolean onItemClick(View view, int position, IDrawerItem drawerItem) { if (!isSelectable()) { checked = !checked; viewHolder.switchView.setChecked(checked); } return false; } }); //call the onPostBindView method to trigger post bind view actions (like the listener to modify the item if required) onPostBindView(this, viewHolder.itemView); } @Override public ViewHolder getViewHolder(View v) { return new ViewHolder(v); } public static class ViewHolder extends BaseViewHolder { private SwitchCompat switchView; private ViewHolder(View view) { super(view); this.switchView = (SwitchCompat) view.findViewById(R.id.material_drawer_switch); } } private CompoundButton.OnCheckedChangeListener checkedChangeListener = new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isEnabled()) { checked = isChecked; if (getOnCheckedChangeListener() != null) { getOnCheckedChangeListener().onCheckedChanged(AbstractSwitchableDrawerItem.this, buttonView, isChecked); } } else { buttonView.setOnCheckedChangeListener(null); buttonView.setChecked(!isChecked); buttonView.setOnCheckedChangeListener(checkedChangeListener); } } }; }