Skip to content

Instantly share code, notes, and snippets.

@twiceyuan
Last active January 16, 2017 07:00
Show Gist options
  • Save twiceyuan/2432bd8c8a0e5ef8fbbd to your computer and use it in GitHub Desktop.
Save twiceyuan/2432bd8c8a0e5ef8fbbd to your computer and use it in GitHub Desktop.
可以保存 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);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment