Android实战开发中,ListView的使用率是相当的高,再结合CheckBox实现多选功能去进行增删改查功能非常普遍,市面上已经有很多方法,有些讲的很详细可有时也不太适合自己,有些又可能会用一些自定义控件不是很理想,接下来会说明不去使用自定义控件,还会把具体实现多选功能的主要步骤清晰呈现。

一、首先当然是布局文件,直接上代码

1、ListView不用多说,是个人都会:

android:id="@+id/lv"

android:scrollbars="none"

android:layout_width="match_parent"

android:layout_weight="1"

android:layout_height="0dp" >

2、接下来是Adapter所需要的模板布局,其中包含一个CheckBox和一个TextView,其配置如下:

android:layout_width="match_parent"

android:layout_height="72dp"

android:orientation="horizontal" >

android:id="@+id/cb_multiselect"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:focusable="false"

android:visibility="gone" />

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 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;i

if(stateCheckedMap.get(i)){

checkedAccountList.add(accountList.get(i));

}

}

综上:到此为止Android实战开发中的ListView的多选删除、添加、修改、查看和移动等操作现在都可以完善了,其思路万变不离其宗,欢迎讨论。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐