ListVIEw控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adapter的用法,加了很多的判断等等等等….我们先来看看实现的效果吧!
好的,我们新建一个项目LvCheckBox
我们事先先把这两个布局写好吧,一个是主布局,还有一个ListvIEw的item.xml,相信不用多说
activity_main.xml
<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"xmlns:tools="http://schemas.androID.com/tools"androID:layout_wIDth="match_parent"androID:layout_height="match_parent"androID:orIEntation="vertical" ><relativeLayoutandroID:layout_wIDth="match_parent"androID:layout_height="50dp"androID:background="#238286" ><TextVIEwandroID:layout_wIDth="wrap_content"androID:layout_height="wrap_content"androID:layout_centerInParent="true"androID:text="ListVIEw绑定CheckBox"androID:textcolor="#fff" /><TextVIEwandroID:ID="@+ID/tv_add"androID:layout_wIDth="wrap_content"androID:layout_height="wrap_content"androID:layout_alignParentRight="true"androID:layout_centerVertical="true"androID:layout_marginRight="17dp"androID:text="增加"androID:textcolor="#fff" /></relativeLayout><ListVIEwandroID:ID="@+ID/ListvIEw"androID:layout_wIDth="match_parent"androID:layout_height="0dp"androID:layout_weight="1" ></ListVIEw><linearLayoutandroID:layout_wIDth="match_parent"androID:layout_height="50dp"androID:orIEntation="horizontal" ><buttonandroID:ID="@+ID/btn_detele"androID:layout_wIDth="match_parent"androID:layout_height="match_parent"androID:layout_marginRight="1dp"androID:layout_weight="1"androID:background="#238286"androID:text="删除"androID:textcolor="#fff" /><buttonandroID:ID="@+ID/btn_select_all"androID:layout_wIDth="match_parent"androID:layout_height="match_parent"androID:layout_marginleft="1dp"androID:layout_weight="1"androID:background="#238286"androID:text="全选"androID:textcolor="#fff" /></linearLayout></linearLayout>
item.xml
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"androID:layout_wIDth="match_parent"androID:layout_height="50dp"androID:gravity="center_vertical"androID:orIEntation="horizontal" ><TextVIEwandroID:ID="@+ID/tvTitle"androID:layout_wIDth="wrap_content"androID:layout_height="wrap_content"androID:layout_marginleft="15dp"androID:layout_weight="7"androID:text="text" /><CheckBoxandroID:ID="@+ID/cbCheckBox"androID:layout_wIDth="wrap_content"androID:layout_height="wrap_content"androID:layout_weight="1" /></linearLayout>
item.xml只有两个控件,很好理解吧
初始化控件
我们用initVIEw()方法来初始化这些控件
private voID initVIEw() {tv_add = (TextVIEw) findVIEwByID(R.ID.tv_add);tv_add.setonClickListener(this);btn_detele = (button) findVIEwByID(R.ID.btn_detele);btn_detele.setonClickListener(this);btn_select_all = (button) findVIEwByID(R.ID.btn_select_all);btn_select_all.setonClickListener(this);ListvIEw = (ListVIEw) findVIEwByID(R.ID.ListvIEw);}
然后继承点击事件,button的和ListvIEw的
implements OnClickListener,OnItemClickListener
自定义Adapter
这里最难的就是adapter了
1.Bean
我们为了数据的记录方便,我们提前写一个实体类
package com.lgl.lvcheckBox;public class Bean {private String Title;// 构造方法public Bean(String Title) {super();this.Title = Title;}public String getTitle() {return Title;}public voID setTitle(String Title) {this.Title = Title;}}
listadapter
这里所有的都写了注释,也方便大家看清
package com.lgl.lvcheckBox;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;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.Compoundbutton;import androID.Widget.Compoundbutton.OnCheckedchangelistener;import androID.Widget.TextVIEw;/*** 自定义适配器* * @author LGL**/public class listadapter extends BaseAdapter {// 数据集private List<Bean> List = new ArrayList<Bean>();// 上下文private Context mContext;// 存储勾选框状态的map集合private Map<Integer,Boolean> isCheck = new HashMap<Integer,Boolean>();// 构造方法public listadapter(Context mContext) {super();this.mContext = mContext;// 默认为不选中initCheck(false);}// 初始化map集合public voID initCheck(boolean flag) {// map集合的数量和List的数量是一致的for (int i = 0; i < List.size(); i++) {// 设置默认的显示isCheck.put(i,flag);}}// 设置数据public voID setData(List<Bean> data) {this.List = data;}// 添加数据public voID addData(Bean bean) {// 下标 数据List.add(0,bean);}@OverrIDepublic int getCount() {// Todo auto-generated method stub// 如果为null就返回一个0return List != null ? List.size() : 0;}@OverrIDepublic Object getItem(int position) {// Todo auto-generated method stubreturn List.get(position);}@OverrIDepublic long getItemID(int position) {// Todo auto-generated method stubreturn position;}@OverrIDepublic VIEw getVIEw(final int position,VIEw convertVIEw,VIEwGroup parent) {VIEwHolder vIEwHolder = null;VIEw vIEw = null;// 判断是不是第一次进来if (convertVIEw == null) {vIEw = LayoutInflater.from(mContext).inflate(R.layout.item,null);vIEwHolder = new VIEwHolder();vIEwHolder.Title = (TextVIEw) vIEw.findVIEwByID(R.ID.tvTitle);vIEwHolder.cbCheckBox = (CheckBox) vIEw.findVIEwByID(R.ID.cbCheckBox);// 标记,可以复用vIEw.setTag(vIEwHolder);} else {vIEw = convertVIEw;// 直接拿过来用vIEwHolder = (VIEwHolder) vIEw.getTag();}// 拿到对象Bean bean = List.get(position);// 填充数据vIEwHolder.Title.setText(bean.getTitle().toString());// 勾选框的点击事件vIEwHolder.cbCheckBox.setonCheckedchangelistener(new OnCheckedchangelistener() {@OverrIDepublic voID onCheckedChanged(Compoundbutton buttonVIEw,boolean isChecked) {// 用map集合保存isCheck.put(position,isChecked);}});// 设置状态if (isCheck.get(position) == null) {isCheck.put(position,false);}vIEwHolder.cbCheckBox.setChecked(isCheck.get(position));return vIEw;}// 优化public static class VIEwHolder {public TextVIEw Title;public CheckBox cbCheckBox;}// 全选按钮获取状态public Map<Integer,Boolean> getMap() {// 返回状态return isCheck;}// 删除一个数据public voID removeData(int position) {List.remove(position);}}
当然,有些方法是后面写的,我们提前写好,比如删除和增加什么的
初始化数据
我们默认总是需要点数据的
private voID initData() {// 默认显示的数据List<Bean> List = new ArrayList<Bean>();List.add(new Bean("张三"));List.add(new Bean("李四"));List.add(new Bean("王五"));adapter = new listadapter(this);adapter.setData(List);ListvIEw.setAdapter(adapter);}
增加数据
// 添加数据case R.ID.tv_add:adapter.addData(new Bean("刘桂林"));// 通知刷新适配器adapter.notifyDataSetChanged();break;
全选数据
当我们全选的时候,按钮应该为全不选的,所以这里我们这里有状态的
case R.ID.btn_select_all:// 全选――全不选Map<Integer,Boolean> isCheck = adapter.getMap();if (btn_select_all.getText().equals("全选")) {adapter.initCheck(true);// 通知刷新适配器adapter.notifyDataSetChanged();btn_select_all.setText("全不选");btn_select_all.setTextcolor(color.YELLOW);} else if (btn_select_all.getText().equals("全不选")) {adapter.initCheck(false);// 通知刷新适配器adapter.notifyDataSetChanged();btn_select_all.setText("全选");btn_select_all.setTextcolor(color.YELLOW);}break;
删除数据
删除也是要考虑很多因素
// 删除数据case R.ID.btn_detele:// 拿到所有数据Map<Integer,Boolean> isCheck_delete = adapter.getMap();// 获取到条目数量,map.size = List.size,所以int count = adapter.getCount();// 遍历for (int i = 0; i < count; i++) {// 删除有两个map和List都要删除,计算方式int position = i - (count - adapter.getCount());// 判断状态 true为删除if (isCheck_delete.get(i) != null && isCheck_delete.get(i)) {// ListvIEw删除数据isCheck_delete.remove(i);adapter.removeData(position);}}btn_select_all.setText("全选");btn_select_all.setTextcolor(color.WHITE);adapter.notifyDataSetChanged();break;
这里的
int position = i - (count - adapter.getCount());
是一个计算方式,当我们删除之后,实际上数组是需要重新排列的,同时按钮也要变回全选状态的
ListvIEw的点击
我们直接点击也是可以勾选cheakBox选中的// ListvIEw的点击事件@OverrIDepublic voID onItemClick(AdapterVIEw<?> parent,VIEw vIEw,int position,long ID) {// 判断vIEw是否相同if (vIEw.getTag() instanceof VIEwHolder) {// 如果是的话,重用VIEwHolder holder = (VIEwHolder) vIEw.getTag();// 自动触发holder.cbCheckBox.toggle();}}
以上所述是小编给大家介绍的AndroID中ListVIEw绑定CheckBox实现全选增加和删除功能(DEMO),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!
总结以上是内存溢出为你收集整理的Android中ListView绑定CheckBox实现全选增加和删除功能(DEMO)全部内容,希望文章能够帮你解决Android中ListView绑定CheckBox实现全选增加和删除功能(DEMO)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)