Android中ListView结合CheckBox实现数据批量选择(全选、反选、全不选)
程序员文章站
2024-02-12 14:31:04
app的开发中,会常遇到这样的需求:批量取消(删除)list中的数据。这就要求listview支持批量选择、全选、单选等等功能,做一个比较强大的listview批量选择功能...
app的开发中,会常遇到这样的需求:批量取消(删除)list中的数据。这就要求listview支持批量选择、全选、单选等等功能,做一个比较强大的listview批量选择功能是很有必要的,那如何做呢?
可想而知,要支持批量选择,那checkbox的使用是不可或缺的,下面,就使用listview结合checkbox实现数据的批量选择。
先看下效果图,有图有真相:
先说明接下来要实现的listview+checkbox支持的功能:
- 1. 外部点击“编辑”(长按listview的某一项也可),出现复选框;
- 2. 支持全选、复选、全不选
- 3. 支持获取选中的数据的信息
接下来,带大家看下实现的步骤:
1. 定义list_item_data.xml,列表的内容显示,要求其中含有checkbox
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#ffffff" android:orientation="horizontal"> <linearlayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="center_vertical" android:orientation="horizontal"> <checkbox android:id="@+id/checkbox_operate_data" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_margin="6dp" android:visibility="gone" /> <imageview android:id="@+id/material_item_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:adjustviewbounds="true" android:scaletype="centercrop" android:src="@mipmap/ic_launcher" /> </linearlayout> <linearlayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:orientation="horizontal" android:paddingbottom="10dp" android:paddingtop="10dp"> <view android:id="@+id/user_head_img" android:layout_width="5dp" android:layout_height="fill_parent" android:background="#4483c9" /> <linearlayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <textview android:id="@+id/text_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" android:singleline="true" android:text="标题" android:textcolor="#555555" android:textsize="16sp" /> <linearlayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margintop="10dp" android:gravity="center_vertical" android:orientation="horizontal"> <textview android:id="@+id/text_desc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="bottom" android:singleline="true" android:text="描述描述描述描述描述描述" android:textcolor="#aaaaaa" android:textsize="14sp" /> </linearlayout> </linearlayout> </linearlayout> </linearlayout>
2. 定义数据显示的bean
public class databean { public string id; public string title; public string desc; public boolean ischeck; public databean(string id, string title, string desc) { this.id = id; this.title = title; this.desc = desc; } }
注:databean中含有ischeck属性,该属性主要标志checkbox是否选中。
3. 定义数据显示的adapter,在该adapter中,我们需要实现两个重要的功能:控制是否显示checkbox; 控制checkbox是否显示
import android.content.context; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.baseadapter; import android.widget.checkbox; import android.widget.textview; import java.util.list; public class myadapter extends baseadapter { private context mcontext; private list<databean> mdatas; private layoutinflater minflater; public boolean flage = false; public myadapter(context mcontext, list<databean> mdatas) { this.mcontext = mcontext; this.mdatas = mdatas; minflater = layoutinflater.from(this.mcontext); } @override public int getcount() { return mdatas.size(); } @override public object getitem(int i) { return mdatas.get(i); } @override public long getitemid(int i) { return i; } @override public view getview(int position, view convertview, viewgroup viewgroup) { viewholder holder = null; if (convertview == null) { // 下拉项布局 convertview = minflater.inflate(r.layout.list_item_data, null); holder = new viewholder(); holder.checkboxoperatedata = (checkbox) convertview.findviewbyid(r.id.checkbox_operate_data); holder.texttitle = (textview) convertview.findviewbyid(r.id.text_title); holder.textdesc = (textview) convertview.findviewbyid(r.id.text_desc); convertview.settag(holder); } else { holder = (viewholder) convertview.gettag(); } final databean databean = mdatas.get(position); if (databean != null) { holder.texttitle.settext(databean.title); holder.textdesc.settext(databean.desc); // 根据isselected来设置checkbox的显示状况 if (flage) { holder.checkboxoperatedata.setvisibility(view.visible); } else { holder.checkboxoperatedata.setvisibility(view.gone); } holder.checkboxoperatedata.setchecked(databean.ischeck); //注意这里设置的不是oncheckedchanglistener,还是值得思考一下的 holder.checkboxoperatedata.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { if (databean.ischeck) { databean.ischeck = false; } else { databean.ischeck = true; } } }); } return convertview; } class viewholder { public checkbox checkboxoperatedata; public textview texttitle; public textview textdesc; } }
注1: flage 字段,用于标志是否显示checkbox,通过在activity中改变该值,即可在getview方法中控制是否显示checkbox。
注2: 定义checkbox的setonclicklistener方法,而不是oncheckedchanglistener,如此使用,可方便控制checkbox是否选中。
4. 定义activity
public class mainactivity extends activity { private button button; private listview listview; private list<databean> mdatas; private myadapter madapter; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); button = (button) findviewbyid(r.id.button); listview = (listview) findviewbyid(r.id.listview); mdatas = new arraylist<>(); for (int i = 0; i < 20; i++) { databean databean = new databean("" + i, "上邪", "山无棱,天地合,乃敢与君绝"); mdatas.add(databean); } madapter = new myadapter(this, mdatas); listview.setadapter(madapter); } /** * 编辑、取消编辑 * @param view */ public void btneditlist(view view) { madapter.flage = !madapter.flage; if (madapter.flage) { button.settext("取消"); } else { button.settext("编辑"); } madapter.notifydatasetchanged(); } /** * 全选 * @param view */ public void btnselectalllist(view view) { if (madapter.flage) { for (int i = 0; i < mdatas.size(); i++) { mdatas.get(i).ischeck = true; } madapter.notifydatasetchanged(); } } /** * 全不选 * @param view */ public void btnnolist(view view) { if (madapter.flage) { for (int i = 0; i < mdatas.size(); i++) { mdatas.get(i).ischeck = false; } madapter.notifydatasetchanged(); } } /** * 反选 * @param view */ public void btnfanxuanlist(view view) { if (madapter.flage) { for (int i = 0; i < mdatas.size(); i++) { if (mdatas.get(i).ischeck) { mdatas.get(i).ischeck = false; } else { mdatas.get(i).ischeck = true; } } madapter.notifydatasetchanged(); } } /** * 获取选中数据 * @param view */ public void btnoperatelist(view view) { list<string> ids = new arraylist<>(); if (madapter.flage) { for (int i = 0; i < mdatas.size(); i++) { if (mdatas.get(i).ischeck) { ids.add(mdatas.get(i).id); } } toast.maketext(mainactivity.this,ids.tostring(), toast.length_short).show(); log.e("tag", ids.tostring()); } } }
如此这般,完美的可批量选择的listview便实现了,希望大家喜欢。