Android ListView CHOICE_MODE_MULTIPLE_MODAL多选模式解析

最近的课程需要做一个通讯录App,于是就想借鉴Android自带的Contacts应用,实现里面的一些效果。在删除联系人时,Contacts的界面是这样的。

删除联系人

一开始觉得这个功能很复杂,后来在网上找了一下,发现这个功能是Android自带的,只要在xml布局文件中将ListViewmode属性设置为CHOICE_MODE_MULTIPLE_MODAL,然后在列表项上长按,即可进入多选模式,同时工具栏也会发生变化。

要想处理多选模式下的各种行为(更换菜单栏、响应列表项的check状态变化以及菜单项的点击事件),需要一个实现ListView.MultiChoiceModeListener,然后将这个类的对象传给ListViewsetMultiChoiceModeListener()方法。

ListView.MultiChoiceModeListener接口的方法

MultiChoiceModeListener中只有了onItemCheckedStateChanged(...)方法,但是它继承了ActionMode.Callback接口,里面又包含onCreateActionMode(...)onPrepareActionMode(...)onActionItemClicked(...)、和onDestroyActionMode(...)方法,这些方法由ListView回调。

下面对这几个方法里要做的工作做简要介绍:

  • onItemCheckedStateChanged(...):这是多选模式下特有的方法,监听列表项的选中状态变化,比如可以在里面进行CheckBox的UI更新,也可以是标题栏中选择的项的数量更新。
  • onCreateActionMode(...):可以进行多选模式下的菜单栏布局更新,但是只在多选模式创建时调用一次。
  • onPrepareActionMode(...):在创建完成后,每当需要进行菜单栏布局的更新,可以在这个方法中进行。
  • onActionItemClicked(...):监听多选模式下的菜单栏项的点击事件。
  • onDestroyActionMode(...):在多选模式退出时调用,可以在里面完成还原正常模式下的菜单栏布局。

实现多选删除功能还需要知道的一点知识

当我点击了多选菜单栏中的删除按钮时,我如何得知哪些列表项是被选中的呢?

ListView为我们提供了getCheckedItemPositions()方法,但其返回结果并不是一个简单的下表的列表,而是一个SparseBooleanArray对象,里面包括了每个被选中项的index,以及其选中状态(`getCheckedItemPositions()方法返回的肯定都是true了,但是当返回的是所有列表项的SparseBooleanArray对象时,里面的选中状态就有用了)。但是直接根据index删除,List中项的index会发生变化,可以先将指定index的对象全部取出放在另一个List里,然后调用List.remove(Object)方法,这样就可以避免错删了。

实现的效果以及源代码

我的删除联系人效果

源代码如下:

布局文件fragment_multi_choice_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值