ListView的单选、多选模式:以官方Demo为例

1.   ListView的choiceMode属性

  首先可以看链接的内容,详细解释了以下四种模式。

【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

多选,但是屏蔽点击事件

 

2.   官方Demo

2.1 ListView设置

   这里以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】。

2.2自定义ListView的Item

自定义的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资源文件来设置的。

3.   总结

    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】提到的“愚蠢”方法。



你可能感兴趣的:(Android开发)