Last active
January 16, 2017 07:00
-
-
Save twiceyuan/2432bd8c8a0e5ef8fbbd to your computer and use it in GitHub Desktop.
可以保存 Check 状态的 LinearLayout
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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