首先可以看链接的内容,详细解释了以下四种模式。
【ListView多选操作模式详解CHOICE_MODE_MULTIPLE与CHOICE_MODE_MULTIPLE_MODAL:http://blog.csdn.net/jianghejie123/article/details/40860565?utm_source=tuicool&utm_medium=referral】
ListView的choiceMode属性可以在XML中设置(推荐),例如:android:choiceMode="multipleChoice"。
表1,ListView的4种选择属性
选择模式 |
XML属性 |
CHOICE_MODE_NONE |
默认,不用显式设置 |
CHOICE_MODE_SINGLE |
单选并触发点击事件 |
CHOICE_MODE_MULTIPLE |
多选并触发点击事件 |
CHOICE_MODE_MULTIPLE_MODAL |
多选,但是屏蔽点击事件 |
这里以Android6.0 SDK中CustomChoiceList(路径为sdk/samples/android-23/ui/CustomChoiceList,如果没有可以查看android-22,两者一致)为例。
首先看主界面sample_main.xml的设置:
ListView上面一段英文讲了4件重要的注意事件:
1) 设置android:choiceMode="multipleChoice"之后ListView将支持多选;
2) Android的框架提供了标准的用于ListView的radiobuttons和check boxes即android.R.layout.simple_list_item_single_choice和android.R.layout.simple_list_item_multiple_choice,他们都是单独的CheckedTextView(TextView实现了Checkable 接口)。其中android.R.layout.simple_list_item_single_choice的XML文件为:
3) 在某些情况下,你需要自定义ListView条目(Item)的视图,这个视图的根必须实现Checkable 接口,就像CheckedTextView一样,否则Check的事件不能传入该视图的子视图。
4) 最后,根据官方的UI中关于ListView的设置指南,需要设置ListView的padding值,这样ListView的滑动条不用显示在ListView里面。关于这一条,可以参看:【关于android:scrollbarStyle属性:http://blog.csdn.net/duanyipeng/article/details/8591575】。
自定义的Item视图必须实现Checkable接口,该接口有3个方法:
/**
* Defines an extension for views that make them checkable.
*
*/
public interface Checkable {
/**
* Change the checked state of the view
*
* @param checked The new checked state
*/
void setChecked(boolean checked);
/**
* @return The current checked state of the view
*/
boolean isChecked();
/**
* Change the checked state of the view to the inverse of its current state
*
*/
void toggle();
}
Dmeo中采用了线性布局来实现该接口:
/** * 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. *
* 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 CheckableLinearLayout extends LinearLayout implements Checkable { private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked}; private boolean mChecked = false; public CheckableLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); } public boolean isChecked() { return mChecked; } public void setChecked(boolean b) { if (b != mChecked) { mChecked = b; 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; } } 之后,用该Item作为容器,添加子类:
这里水平放置了一个TextView和一个ImageView。注意,属性android:duplicateParentState="true"保证子类可以根据父类Check的状态而变化,而子类的变化情况都是根据drawable资源文件来设置的。
ListView的单选和多选模式使用频率比较高,官方Dmeo推荐的方式是:
1) 使用AndroidFrameWork推荐的用于ListView的标准单选和多选视图;
2) 自定义Item视图的容器,但必须实现Checkable接口,同时容器里响应的响应类必须支持Check事件,且要设置android:duplicateParentState="true"。
最后,如果是支持ListView特定数量的多选,比如,最多支持5个多选,那么久必须按照【ListView多选操作模式详解CHOICE_MODE_MULTIPLE与CHOICE_MODE_MULTIPLE_MODAL:http://blog.csdn.net/jianghejie123/article/details/40860565?utm_source=tuicool&utm_medium=referral】提到的“愚蠢”方法。