布局与控件(八)-ListView知多少(下)ChoiceMode详解

9.4 ListView的Choice Mode

ListView本身带有单选和多选功能,也就是说在单选模式下,它能够记住当前选中的唯一的列表项;在多选模式下,它能够记住目前选取的所有的列表项。

这种选择模式共有4种CHOICE_MODE_NONE CHOICE_MODE_SINGLE CHOICE_MODE_MULTIPLE CHOICE_MODE_MULTIPLE_MODAL

使用setChoiceMode()函数,就可以设置ListView的选择模式。

ListView lv = (ListView) findViewById(R.id.list_view);
lv.setChoiceMode(ListView.CHOICE_MODE_NONE);

9.4.1 CHOICE_MODE_NONE

这是ListView默认的选择模式,当使用者点击列表项后,不会将任何点击的列表项当成被选择上的列表项。

9.4.2 CHOICE_MODE_SINGLE

使用这个选项模式,当使用者点击列表项后,会将最后一次点击的列表项当成被选择上的列表项。

ArrayAdapter adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_single_choice , datalist);
lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
lv.setAdapter(adapter);

每次点击列表项,可以在它的监听函数中得知那个列表项被点击了,

lv.setOnItemClickListener(new ListView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //添加需要响应的操作
    }
}

以后就可以通过ListViewgetCheckedItemPositions()获取被选中的数据项的位置列表,

SparseBooleanArray checkedItems = lv.getCheckedItemPositions();

例如,当列表项按照序号为3->2->1-7的顺序被点击后,7将被记录下来,作为当前被选中的数据项。调用getCheckedItemPositions()后,将得到一个键值对,里面只会记录,

key=7, value=true

这里为了看到被选中的效果,采用了Android SDK提供的android.R.layout.simple_list_item_single_choice布局,作为列表项的布局。

9.4.3 CHOICE_MODE_MULTIPLE

使用这个选项模式,当使用者点击列表项后,会将所有点击的列表项当成被选择上的列表项。

ArrayAdapter adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_multiple_choice, datalist);
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
lv.setAdapter(adapter);

每次点击列表项,可以在它的监听函数中得知那个列表项被点击了,

lv.setOnItemClickListener(new ListView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //添加需要响应的操作
    }
}

通过ListViewgetCheckedItemPositions()获取被选中的数据项的位置列表,

SparseBooleanArray checkedItems = lv.getCheckedItemPositions();

例如,当列表项按照序号为3->2->1->7的顺序被点击后,3 2 1 7将被记录下来,作为当前被选中的数据项。调用getCheckedItemPositions()后,将得到一个个键值对,里面会记录,

key=1, value=true
key=2, value=true
key=3, value=true
key=7, value=true

这些记录,将按照列表项的位置从小到大排列。

如果用户在已经被选上的数据项上,又再次点击,这将取消对它的选择。例如,当列表项按照序号为3->2->1->7->2->1的顺序被点击后,就变成了,

key=1, value=false
key=2, value=false
key=3, value=true
key=7, value=true

对于被取消了选择的列表项,并不会从记录中移除,而是改变它的值成false

这里为了看到被选中的效果,采用了Android SDK提供的android.R.layout.simple_list_item_multiple_choice布局,作为列表项的布局。

9.4.4 CHOICE_MODE_MULTIPLE_MODAL

CHOICE_MODE_MULTIPLE模式中,当用户必须通过长按任意一个列表项,进入多选模式,否则不能进行多选。

这个模式的使用与CHOICE_MODE_MULTIPLE类似,不过它需要设置一个ActionMode,这样才能在长按列表项后,改变ActionBar的菜单栏,打开多选的菜单。

  1. 实现ListViewMultiChoiceModeListener接口,

    private class MyMultiChoiceModeListener implements ListView.MultiChoiceModeListener {
    
        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
    
            //添加列表项被点击后的响应
        }
    
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            //这里返回true
            return true;
        }
    
        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            //这里返回true
            return true;
        }
    
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            //这里返回true
            return true;
        }
    
        @Override
        public void onDestroyActionMode(ActionMode mode) {
    
        }
    }
  2. 使用创建的接口,传递给ListView
    ArrayAdapter adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_multiple_choice, datalist);
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    
    ListView.MultiChoiceModeListener callback = new MyMultiChoiceModeListener();
    lv.setMultiChoiceModeListener(callback);
    lv.setAdapter(adapter);

CHOICE_MODE_MULTIPLE_MODAL模式下,对列表项的点击,是在ListView.MultiChoiceModeListeneronItemCheckedStateChanged()函数中响应的。

这里为了看到被选中的效果,采用了Android SDK提供的android.R.layout.simple_list_item_multiple_choice布局,作为列表项的布局。

9.4.5 关于单选和多选的状态背景

前面的演示中,分别对不同的选择模式,使用了不同的数据项布局,

CHOICE_MODE_SINGLE         --> android.R.layout.simple_list_item_single_choice
CHOICE_MODE_MULTIPLE       --> android.R.layout.simple_list_item_multiple_choice
CHOICE_MODE_MULTIPLE_MODAL --> android.R.layout.simple_list_item_multiple_choice

我们也可以选择自己的布局来实现。但是不管使用什么布局,我们都希望被选上的列表项有特别的效果,和其他没有被选上的数据项区别开。这里有两种方案,

  1. 使用实现了Clickable接口的控件或者布局,作为数据项的布局。例如前面我们使用的android.R.layout.simple_list_item_multiple_choice android.R.layout.simple_list_item_single_choice等,它们本身就是CheckedTextView。当点击它们的时候,它们就自带了勾选框,可以看到效果。

    所以,可以选择CheckBox Switch这类同样实现了Clickable接口的布局来表现;也可以自定义一个实现了Clickable接口的布局。这里用android.R.layout.simple_list_item_multiple_choice的实现来举个例子,

    <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="?android:attr/listPreferredItemHeightSmall"
        android:textAppearance="?android:attr/textAppearanceListItemSmall"
        android:gravity="center_vertical"
        android:checkMark="?android:attr/listChoiceIndicatorMultiple"
        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" />
  2. 给数据项的布局使用一个Selector,告诉这个布局,当它被activated以后要怎么显示。比如,定义一个布局custom_item_layout.xml,
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="48dp" --> 为了布局好看设置一个最小高度
        android:gravity="center_vertical"
        android:padding="5dp"
        android:background="@drawable/selector">
    
    </TextView>

    给这个布局设计一个selector,增加对android:activated属性的设置,

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_activated="true" android:drawable="@color/yellow"/>
    </selector>

    使用这个这个布局,

    ArrayAdapter adapter = new ArrayAdapter<String>(this,
                    R.layout.custom_item_layout, datalist);
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    lv.setAdapter(adapter);

    当我们多选的时候,那些选中项,就变成黄色,看到如下的界面,

时间: 2024-10-20 09:25:00

布局与控件(八)-ListView知多少(下)ChoiceMode详解的相关文章

Android UI布局与控件(二)

一.View类的常用xml属性:[了解] ①.Android中所有的UI(用户界面)元素都是使用View和ViewGroup对象建立的 ②.View是一个可以将一些信息绘制在屏幕上并与用户产生交互的对象 ③.ViewGroup是一个包含多个的View和ViewGroup的容器,用来定义UI布局. ④.Android提供了一系列的View和ViewGroup的子类,开发者可以灵活地组合使用它们来完成界面布 局.界 面元素绘制和用户交互等工作 ⑤.开发者还可以选择性地继承一些系统提供的View,来自

Android基本控件之ListView(一)

我们在使用手机的时候,通常看到,像通讯录,QQ列表样式的东西,这里来解释一下,其实那些都是一个ListView 今天,我们就来详细的讲解一下ListView这个控件 ListView中每条显示的数据都称为一个item.每个item都有自己的布局. 在这里,我们就先来实现一个简单的功能,用来解释ListView这个控件 我们就来做一个最简单的只显示文本和图片的这样的一个ListView. 我先来和大家一起分析一下我们应该准备些什么: 首先,我们需要一个主界面布局文件,并在布局文件中定义一个List

Android UI布局与控件及API Guide学习(一)

一.Android学习API指南:[了解] 1. 应用的组成部分   App Components 1.1. 应用的基本原理    App Fundamentals 1.2. Activity      Activities活动 1.2.1. 片段    Fragments 1.2.2. 加载器     Loaders 1.2.3. 任务和返回堆    Tasks and Back Stack 1.3. Service服务   Services 1.3.1. 绑定服务     Bound Ser

布局与控件(五)-Toast吐司与布局的抽象标签merge include ViewStub

第5节 Toast 5.1 使用效果 Toast用来向用户弹出一个提示框,然后自动消失,就像这样, 面包机烤好面包后,就腾的一下把面包从面包机里弹出来.而这个控件显示时也像是从面包机里弹出来的,所以取了这个名字-Toast(吐司). 使用Toast显示消息的时候,即使启动它的Activity并没有显示在屏幕上,Toast提示的消息也会被显示到最前面,让用户看到.例如, Activity A正通过网络下载一个文件, 此时用户点击Home回到主界面,又启动了另一个应用的Activity B:现在Ac

布局与控件(一)——布局与控件的常用概念

第1节 布局与控件的常用概念 界面设计中的控件,就是我们常常看到的按钮 滑动条 文字显示区等等,它们就像房间里的家具,是界面设计的最小单位. 布局是一个可以容纳别的布局(或者控件)的容器.它就像是一个大的房间,房间里面可以放各种家具(控件),也可以再隔离成更多的房间(放入别的布局). 不过,两者有很多共同的地方,例如定义它们的大小.边距等等. 1.1 尺寸单位 在使用布局或控件时,有时需要指定它们的尺寸.安卓系统提供了三种单位: px:以像素为单位进行设置,屏幕上每一个点,就是一个像素,例如一部

android代码编写布局和控件

//创建线性linearlayout布局对象  LinearLayout ll = new LinearLayout(this);    //设置linearlayout布局方向  ll.setOrientation(LinearLayout.VERTICAL);    //得到布局或控件高度  int height = LinearLayout.LayoutParams.MATCH_PARENT;    //得到布局或控件宽度  int width = LinearLayout.LayoutP

07.移动先行之谁主沉浮----控件之轮流轰炸——布局类控件

如果移动方向有任何问题请参考===> 异常处理汇总-移动系列(点) 一.布局类控件 Grid.StackPanel.Canvas. VariableSizedWrapGrid 1.布局控件 - Grid 网格控件,网格布局: 相当于 HTML 中的 Table 标签: 但是注意 Table 更重要的是展示数据,而 Grid 则是专门为布局所生: 属性标记: Grid.RowDefinitions:行定义,元素类型 RowDefinition,必要属性 Height Grid.ColumnDefi

windows窗体控件之listview列表视图

1.添加标题 winform.listview.gridLines=true;//显示列表线,也可在属性表设置 winform.listview.insertColumn("列标题",列宽,位置,样式) winform.listview.insertColumn("标题2",列宽,位置,样式)//后加的在前面(若不注明位置) winform.listview.insertColumn("第一列", 40, 1); winform.listview

你应该知道的c# 反射详解

C#反射 首先了解C#反射的概念,反射是一个运行库类型发现的过程.通过反射可以得到一个给定程序集所包含的所有类型的列表, 这个列表包括给定类型中定义的方法.字段.属性和事件.也可以动态的发现一组给定类支持的借口.方法的参数和其他 相关信息如基类.命名空间.数据清单等. C#反射命名空间详细介绍: 1.System.Reflection命名空间内的各类型 (1) Assembly通过它可以加载.了解和操纵一个程序集 (2) AssemblyName 通过它可以找到大量隐藏在程序集的身份中的信息,如

led指示灯电路图大全(八款led指示灯电路设计原理图详解)

led指示灯电路图大全(八款led指示灯电路设计原理图详解) led指示灯电路图(一) 图1所示电路中只有两个元件,R选用1/6--1/8W碳膜电阻或金属膜电阻,阻值在1--300K之间. Ne为氖泡,也选取用普通日光灯启辉器中的氖泡,若想用体积小且在60V左右即能启辉的氖灯泡,其型号为NNH-616型,电阻R选用270K的1/6W金属膜电阻.led指示灯电路: led指示灯电路图(二) 采用变压器将高压变为低压,并进行整流滤波,以便输出稳定的低压直流电.开关恒流源又分隔离式电源和非隔离式电源,