twiceyuan
11/20/2015 - 9:14 AM

可以保存 Check 状态的 LinearLayout

可以保存 Check 状态的 LinearLayout

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Checkable;
import android.widget.LinearLayout;

/**
 * This is a simple wrapper for {@link android.widget.LinearLayout} that implements the {@link android.widget.Checkable}
 * interface by keeping an internal 'checked' state flag.
 * <p>
 * This can be used as the root view for a custom list item layout for
 * {@link android.widget.AbsListView} elements with a
 * {@link android.widget.AbsListView#setChoiceMode(int) choiceMode} set.
 */
public class CheckableLayout extends LinearLayout implements Checkable {
    private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};

    private boolean mChecked = false;

    public CheckableLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public boolean isChecked() {
        return mChecked;
    }

    public void setChecked(boolean b) {
        if (b != mChecked) {
            mChecked = b;
            updateChildCheckedState(this, mChecked);
            refreshDrawableState();
        }
    }

    public void toggle() {
        setChecked(!mChecked);
    }

    @Override
    public int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        }
        return drawableState;
    }

    private void updateChildCheckedState(View root, boolean isChecked) {
        if (!(root instanceof ViewGroup)) {
            if (root instanceof Checkable) {
                Checkable checkable = (Checkable) root;
                checkable.setChecked(isChecked);
            }
            return;
        }

        int childCount = ((ViewGroup) root).getChildCount();
        if (childCount > 0) {
            for (int i = 0; i < childCount; i++) {
                updateChildCheckedState(((ViewGroup) root).getChildAt(i), isChecked);
            }
        }
    }
}