近期将会陆续分享、总结做过的项目中遇到的技术点,以便下次用到的时候可以快速的实现相关的功能~
下面介绍的是我在项目当中碰到的listview多选或者说是PullToRefreshListView(我目前用的上拉刷新,下拉加载更多的数据加载框架)的多选。
我相信很多人都会碰到多选的问题,一般item都会有CheckBox控件。另外也可以使用CheckedTextView控件(类CheckedTextView继承超类TextView并实现Checkable接口。当ListView的setChoiceMode方法并设定为CHOICE_MODE_SINGLE或者CHOICE_MODE_MULTIPLE,而非CHOICE_MODE_NONE时,使用此类是很有用的。以上为引用别人的话)。在这我用的是CheckBox控件
(一)
(二)
(三)
下面主要分析listview多选,PullToRefreshListView多选可在最后的下载链接的demo里面找到~
listview多选,个人认为关键在于准确记录选中或者没选中item的位置,这里我是用HashMap来存储选中或者没选中相关的状态
首先item的onItemClick方法里面:
final List<String> members = new ArrayList<String>();
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CheckBox checkBox = (CheckBox) view.findViewById(R.id.item_station_choose_checkbox);
checkBox.toggle();
mStringMap.put(mPickAdapter.getItem(position).stationId, checkBox.isChecked());
//过滤状态
if (mClearSearchBtn.getVisibility() == View.VISIBLE) { //搜索框最右边的"*"图标出现时候
if (choosedMembers != null && choosedMembers.size() > 0) {
int length = mPickAdapter.getCount();
if (length > 0) {
String username = mPickAdapter.getItem(position).stationId;
if (choosedMembers.contains(username)) {
choosedMembers.remove(username);
} else {
if (members.size() > 0) {
if (members.contains(username)) {
members.remove(username);
} else {
members.add(username);
}
} else {
members.add(username);
}
}
}
} else {
int length = mPickAdapter.getCount();
if (length > 0) {
for (int i = 0; i < length; i++) {
String username = mPickAdapter.getItem(i).stationId;
if (mStringMap.get(username)) {
members.add(username);
}
if(members.size()>0 && !mStringMap.get(username) && members.contains(username) ){
members.remove(username);
}
}
}
}
} else {
final List<String> members = getToBeCurrentAddMembers();
if (members != null && members.size() > 0) {
choosedMembers.clear();
choosedMembers.addAll(members);
} else {
choosedMembers.clear();
}
}
}
});
恩,上述代码有点长,我的思路是:
首先:
CheckBox checkBox = (CheckBox) view.findViewById(R.id.item_station_choose_checkbox);
checkBox.toggle();
mStringMap.put(mPickAdapter.getItem(position).stationId, checkBox.isChecked());
通过以上代码,在item选中或者没选中时,都用mStringMap记录点选后的状态
其次: List choosedMembers,用choosedMembers来记录取消图标(*)没出现时选中的item,List 里面的String类型对应的是你打算通过编号ID方式来查找对应item的 item的编号ID(原谅这里有点绕口,意思就是你想通过什么方式来查找对应的item,那么那个String就对应那个方式);
最后: 当取消图标()没出现时,其实相当于直接listview多选,没有搜索功能,所以,要先获取当前选中了哪些item,然后choosedMembers clear清空,重新赋值最新状态的数据。另外,当取消图标()出现时,分两种情况,第一种是:choosedMembers 不为空,那么当进入到搜索过滤阶段(即是取消图标(*)出现阶段),如果过滤到的item已经处于选中状态,那么就要将该item从choosedMembers 中移除,
else {
if (members.size() > 0) {
if (members.contains(username)) {
members.remove(username);
} else {
members.add(username);
}
} else {
members.add(username);
}
}
上述中的members,我想起来了,是之前右上角title处的“确定”按钮还要加入一个统计选中item个数的小功能,下一篇文章再加上那功能了~~
第二种是:choosedMembers 为空,那么当进入到搜索过滤阶段(即是取消图标(*)出现阶段),其实里面的代码逻辑还是跟上面说的那样,是因为之前有一个统计选中item个数的小功能,所以可以暂时先忽略,不会影响到当前demo的整体逻辑~~
最后想说的是:搜索过滤方面,我用的是Filter类,具体逻辑看代码,应该容易理解,哈哈,偷懒一下~