标签:checked item 单选 选中 Android ListView public
在实现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则不保存
我们来看一下效果图:
单选:
多选:
我们重点来看
在于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;
}
}
多选关键代码:
如果你觉得看代码过于繁琐,想整理看一下demo运行效果
https://mp.weixin.qq.com/s/WO-qbdFMH616Lzx03yLpwA
标签:checked,item,单选,选中,Android,ListView,public 来源: https://blog.51cto.com/u_15065852/2899095
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。