(Android)五分钟让你轻松学会ListView单选和多选功能
2015-12-17 09:30
429 查看
在实现ListView单选时,我们可以在
Adapter中自己创建一个selectPosition参数,
这样是能实现需求。
但加入要是再加一个多选
接着又在Adapter中创建了一个记录选中position的集合,也是可以实现的,但是实现起来还是相关繁琐的。过程很不乐观。
这里介绍一种相对简单的实现方式。
关键点,利用ListView中的Choice来实现。
ListView中自带Choice相关功能,提供单选和多选两种Choice模式。
我们可以在布局中设置
android:choiceMode
=
"singleChoice"
同样也可以在代码中处理
lv
.setChoiceMode(ListView.
CHOICE_MODE_MULTIPLE);
对于api很好理解,顾名思义。我们来看一下
比如 getCheckedItemPosition()就是获取当前选中的位置, 注意只有单选模式此方法才有意义
而多选对应的获取方法为 getCheckedItemPositions 返回的是一个SparseBooleanArray对象
这个类型相当于map,是一个key为Integer,value为Boolean的键值对集合,代表激活item选中位置和状态数据
有点需要注意的是不代表你10个item获取到的SparseBooleanArray就一定也是size为10, 他只保存激活的item,
激活是指有过点击操作有过checked变化的
比如你点击了两次第二个item,虽然最后第二个item还是未选中状态,
但有了操作,集合中就会保存了一个 1=false 的键值对数据,代表第二个item当前是未选中,而其他位置的item则不保存
我们来看一下效果图:
单选:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/bd8a422703ca5cbfde760b0842dc4f6d)
多选:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/71c47e25cecadb2d59b71c28550e6146)
我们重点来看
在于ListView的item布局的处理
被选中的item会设置一个checked状态, 因此这里需要Item的根布局实现过Checkable可选中接口,自定义CheckableLinearLayout 继承于LinearLayout
源码下载地址
更多源码请关注微信公众号:aikaifa ,第一时间推送博文源码
Adapter中自己创建一个selectPosition参数,
这样是能实现需求。
但加入要是再加一个多选
接着又在Adapter中创建了一个记录选中position的集合,也是可以实现的,但是实现起来还是相关繁琐的。过程很不乐观。
这里介绍一种相对简单的实现方式。
关键点,利用ListView中的Choice来实现。
ListView中自带Choice相关功能,提供单选和多选两种Choice模式。
我们可以在布局中设置
android:choiceMode
=
"singleChoice"
同样也可以在代码中处理
lv
.setChoiceMode(ListView.
CHOICE_MODE_MULTIPLE);
对于api很好理解,顾名思义。我们来看一下
比如 getCheckedItemPosition()就是获取当前选中的位置, 注意只有单选模式此方法才有意义
而多选对应的获取方法为 getCheckedItemPositions 返回的是一个SparseBooleanArray对象
这个类型相当于map,是一个key为Integer,value为Boolean的键值对集合,代表激活item选中位置和状态数据
有点需要注意的是不代表你10个item获取到的SparseBooleanArray就一定也是size为10, 他只保存激活的item,
激活是指有过点击操作有过checked变化的
比如你点击了两次第二个item,虽然最后第二个item还是未选中状态,
但有了操作,集合中就会保存了一个 1=false 的键值对数据,代表第二个item当前是未选中,而其他位置的item则不保存
我们来看一下效果图:
单选:
多选:
我们重点来看
在于ListView的item布局的处理
被选中的item会设置一个checked状态, 因此这里需要Item的根布局实现过Checkable可选中接口,自定义CheckableLinearLayout 继承于LinearLayout
public class CheckableLinearLayout extends LinearLayout implements Checkable { // checked状态 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) { // 在原有状态中添加一个空间space用于保存checked状态 final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (isChecked()) { // 将checked状态合并到原有的状态数组中 mergeDrawableStates(drawableState, CHECKED_STATE_SET); } return drawableState; } }
源码下载地址
更多源码请关注微信公众号:aikaifa ,第一时间推送博文源码
相关文章推荐
- 详解Android中Intent对象与Intent Filter过滤匹配过程
- Android Studio——cannot resolve method sendmessage
- Android ADT 离线下载
- Android中TextView控件的跑马灯效果实现
- Strongswan5.3.5与Android5.0.2(小米)野蛮模式的L2TPoverIPsec的对接
- Strongswan5.3.3与Android5.0.2(小米) 主模式的对接L2TPoverIPsec
- Android 异步引入缓存机制
- Android adb.exe程序启动不起来,如何处理
- 解决android studio 无法更新插件的问题(某些)
- Android 短信验证码自动填写
- Android Broadcast
- 详解Android中Intent的使用方法
- android 中使用Zxing实现二维码的解码和二维码的生成
- 有用的Github Android资源留存
- Android中Intent习惯用法
- Android 汉子转换成拼音
- android自带标题样式
- 安卓学习笔记五
- android导入第三方jar
- android 组合控件