Android高级控件一ListView绑定CheckBox实现全选增加和删除等功能Word文档格式.docx
《Android高级控件一ListView绑定CheckBox实现全选增加和删除等功能Word文档格式.docx》由会员分享,可在线阅读,更多相关《Android高级控件一ListView绑定CheckBox实现全选增加和删除等功能Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
ListView绑定CheckBox"
textColor="
#fff"
/>
id="
@+id/tv_add"
layout_alignParentRight="
layout_centerVertical="
layout_marginRight="
17dp"
增加"
/RelativeLayout>
ListView
@+id/listview"
0dp"
layout_weight="
1"
/ListView>
LinearLayout
horizontal"
Button
@+id/btn_detele"
1dp"
删除"
@+id/btn_select_all"
layout_marginLeft="
全选"
/LinearLayout>
item.xml
?
xmlversion="
1.0"
encoding="
utf-8"
>
gravity="
center_vertical"
@+id/tvTitle"
15dp"
7"
text"
CheckBox
@+id/cbCheckBox"
item.xml只有两个控件,很好理解吧
初始化控件
我们用initView()方法来初始化这些控件
privatevoidinitView(){
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的
implementsOnClickListener,OnItemClickListener
自定义Adapter
这里最难的就是adapter了
1.Bean
我们为了数据的记录方便,我们提前写一个实体类
packagecom.lgl.lvcheckbox;
publicclassBean{
privateStringtitle;
//构造方法
publicBean(Stringtitle){
super();
this.title=title;
publicStringgetTitle(){
returntitle;
publicvoidsetTitle(Stringtitle){
}
ListAdapter
这里所有的都写了注释,也方便大家看清
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importandroid.content.Context;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.CheckBox;
importandroid.widget.CompoundButton;
importandroid.widget.CompoundButton.OnCheckedChangeListener;
importandroid.widget.TextView;
/**
*自定义适配器
*
*@authorLGL
*
*/
publicclassListAdapterextendsBaseAdapter{
//数据集
privateList<
Bean>
list=newArrayList<
();
//上下文
privateContextmContext;
//存储勾选框状态的map集合
privateMap<
Integer,Boolean>
isCheck=newHashMap<
publicListAdapter(ContextmContext){
this.mContext=mContext;
//默认为不选中
initCheck(false);
//初始化map集合
publicvoidinitCheck(booleanflag){
//map集合的数量和list的数量是一致的
for(inti=0;
i<
list.size();
i++){
//设置默认的显示
isCheck.put(i,flag);
//设置数据
publicvoidsetData(List<
data){
this.list=data;
//添加数据
publicvoidaddData(Beanbean){
//下标数据
list.add(0,bean);
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
//如果为null就返回一个0
returnlist!
=null?
list.size():
0;
publicObjectgetItem(intposition){
returnlist.get(position);
publiclonggetItemId(intposition){
returnposition;
publicViewgetView(finalintposition,ViewconvertView,ViewGroupparent){
ViewHolderviewHolder=null;
Viewview=null;
//判断是不是第一次进来
if(convertView==null){
view=LayoutInflater.from(mContext).inflate(R.layout.item,null);
viewHolder=newViewHolder();
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();
//拿到对象
Beanbean=list.get(position);
//填充数据
viewHolder.title.setText(bean.getTitle().toString());
//勾选框的点击事件
viewHolder.cbCheckBox
.setOnCheckedChangeListener(newOnCheckedChangeListener(){
publicvoidonCheckedChanged(CompoundButtonbuttonView,
booleanisChecked){
//用map集合保存
isCheck.put(position,isChecked);
});
//设置状态
if(isCheck.get(position)==null){
isCheck.put(position,false);
viewHolder.cbCheckBox.setChecked(isCheck.get(position));
returnview;
//优化
publicstaticclassViewHolder{
publicTextViewtitle;
publicCheckBoxcbCheckBox;
//全选按钮获取状态
publicMap<
getMap(){
//返回状态
returnisCheck;
//删除一个数据
publicvoidremoveData(intposition){
list.remove(position);
当然,有些方法是后面写的,我们提前写好,比如删除和增加什么的
初始化数据
我们默认总是需要点数据的
privatevoidinitData(){
//默认显示的数据
List<
list.add(newBean("
张三"
));
李四"
王五"
adapter=newListAdapter(this);
adapter.setData(list);
listview.setAdapter(adapter);
增加数据
caseR.id.tv_add:
adapter.addData(newBean("
刘桂林"
//通知刷新适配器
adapter.notifyDataSetChanged();
break;
全选数据
当我们全选的时候,按钮应该为全不选的,所以这里我们这里有状态的
caseR.id.btn_select_all:
//全选——全不选
Map<
isCheck=adapter.getMap();
if(btn_select_all.getText().equals("
)){
adapter.initCheck(true);
btn_select_all.setText("
全不选"
);
btn_select_all.setTextColor(Color.YELLOW);
}elseif(btn_select_all.getText().equals("
adapter.initCheck(false);
删除数据
删除也是要考虑很多因素
//删除数据
caseR.id.btn_detele:
//拿到所有数据
isCheck_delete=adapter.getMap();
//获取到条目数量,map.size=list.size,所以
intcount=adapter.getCount();
//遍历
count;
//删除有两个map和list都要删除,计算方式
intposition=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.setTextColor(Color.WHITE);
这里的
intposition=i-(count-adapter.getCount());
是一个计算方式,当我们删除之后,实际上数组是需要重新排列的,同时按钮也要变回全选状态的
listview的点击
我们直接点击也是可以勾选cheakbox选中的
//listview的点击事件
publicvoidonItemClick(AdapterView<
parent,Viewview,intposition,
longid){
//判断view是否相同
if(view.getTag()instanceofViewHolder){
//如果是的话,重用
ViewHolderholder=(ViewHolder)view.getTag();
//自动触发
holder.cbCheckBox.toggle();
好的,这样的话就可以实现了。