Android实战开发中,ListView的使用率是相当的高,再结合CheckBox实现多选功能去进行增删改查功能非常普遍,市面上已经有很多方法,有些讲的很详细可有时也不太适合自己,有些又可能会用一些自定义控件不是很理想,接下来会说明不去使用自定义控件,还会把具体实现多选功能的主要步骤清晰呈现。
一、首先当然是布局文件,直接上代码
1、ListView不用多说,是个人都会:
<ListView
android:id="@+id/lv"
android:scrollbars="none"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="0dp" >
ListView>
2、接下来是Adapter所需要的模板布局,其中包含一个CheckBox和一个TextView,其配置如下:
android:layout_width="match_parent"
android:layout_height="72dp"
android:orientation="horizontal" >
"@+id/cb_multiselect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:visibility="gone" />
"@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="item1" />
nearLayout>
二、在Activity创建2个必需的对象,声明为成员,一个是将选择的item汇总的数据集合,一个是存放选择状态的布尔集合,再通过创建Adapter对象时通过参数传进去,并在Adapter构造方法里初始化布尔集合,让其值均为false,表示未选中状态。
注:SparseBooleanArray 实际上是一个Map其效率比HashMap高。
private ArrayList checkedList=new ArrayList();
private SparseBooleanArray stateCheckedMap=new SparseBooleanArray();
三、在Adapter中声明一个必需的布尔变量,表示当前是否是多选状态。
public boolean isShowCheckBox;
这里ListView优化就不多说了,无非是借助ViewHolder实现,剩下的需要在getView中判断isShowCheckBox决定是否显示多选框,还有监听多选框,实现多选计数和通过选择的数量决定是否显示相应的按钮,比如编辑、删除等,相关代码如下:
//判断是否设置了多选框的选择状态
if(isShowCheckBox){
vh.cbMultiselect.setVisibility(View.VISIBLE);
}else{
vh.cbMultiselect.setVisibility(View.GONE);
}
//多选框选择监听事件
vh.cbMultiselect.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//选择计数
if(isChecked){
childCheckedCount++;
}else{
childCheckedCount--;
}
//根据选择的数量决定底部FrameLayout编辑布局是否需要显示
switch(childCheckedCount){
case 0:break;
case 1:break;
default:
}
}
});
四、然后在Activity中设置ListView的长按监听事件和点击每个item的监听事件,并获得其中的多选框按钮进行切换多选状态,还要将选择状态存入stateCheckedMap集合中,这2个监听事件方法的代码如下:
1、ListView长按监听事件
@Override
public boolean onItemLongClick(AdapterView parent, View view,
int position, long id) {
if(!adapter.isShowCheckBox){
adapter.childCheckedCount=0;
ViewHolder vh = (ViewHolder)view.getTag(); //借助ViewHolder拿到CheckBox控件
vh.cbMultiselect.toggle();
lv.setItemChecked(position, vh.cbMultiselect.isChecked());
stateCheckedMap.put(position,vh.cbMultiselect.isChecked());
}
adapter.isShowCheckBox=true;
//通知更新adapter
adapter.notifyDataSetChanged();
return true;
}
2、ListView中点击每个item的监听事件
@Override
public void onItemClick(AdapterView parent, View view, int position,
long id) {
if(adapter.isShowCheckBox){
ViewHolder vh = (ViewHolder)view.getTag();
vh.cbMultiselect.toggle();
lvHomeSub.setItemChecked(position, vh.cbMultiselect.isChecked());
stateCheckedMap.put(position,vh.cbMultiselect.isChecked());
//通知更新adapter
adapter.notifyDataSetChanged();
}else{
Intent intent=new Intent(getActivity(),showActivity.class);
intent.putExtra("entity", entityList.get(position));
startActivity(intent);
}
}
五、当点击编辑、删除、移动等操作按钮时,要通过布尔集合将数据放到数据集合之中,随后再通过Intent传递到相应Activity中,做后续工作。而这一工作相当简单,代码如下:
//将计算好的已选择的多选框放到集合中
checkedAccountList.clear();
for(int i=0;iif(stateCheckedMap.get(i)){
checkedAccountList.add(accountList.get(i));
}
}
综上:到此为止Android实战开发中的ListView的多选删除、添加、修改、查看和移动等操作现在都可以完善了,其思路万变不离其宗,欢迎讨论。