2524天 Mr.贰呆

唯一自信的就是自己的人品。
寻求王者玩家一起开黑净化峡谷环境​​

【Android】实战开发之CheckBox+ListView长按多选增删改查功能完美实现步骤

发布于 / 6118 次围观 / 0 条评论 / Android / 二呆 /

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,其配置如下:

<LinearLayout
android:layout_width="match_parent"
android:layout_height="72dp"
android:orientation="horizontal" >
<CheckBox
    android:id="@+id/cb_multiselect"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:visibility="gone" />
<TextView
 android:id="@+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<Entity> checkedList=new ArrayList<Entity>();
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;i<accountList.size();i++){
    if(stateCheckedMap.get(i)){
        checkedAccountList.add(accountList.get(i));
    }
}
综上:到此为止Android实战开发中的ListView的多选删除、添加、修改、查看和移动等操作现在都可以完善了,其思路万变不离其宗,欢迎讨论。
sitemap