1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Android 带checkbox的listView 实现多选 全选 反选

Android 带checkbox的listView 实现多选 全选 反选

时间:2020-01-30 05:58:06

相关推荐

Android 带checkbox的listView 实现多选 全选 反选

由于listview的一些特性,刚开始写这种需求的功能的时候都会碰到一些问题,重点就是存储每个checkbox的状态值,在这里分享出了完美解决方法:

布局文件:

[html]view plaincopy <?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/tv"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="center_vertical"/><LinearLayoutandroid:id="@+id/line"android:layout_width="fill_parent"android:layout_height="50dp"android:layout_below="@+id/tv"android:orientation="horizontal"><Buttonandroid:id="@+id/bt_selectall"android:layout_width="80dp"android:layout_height="fill_parent"android:text="全选"/><Buttonandroid:id="@+id/bt_cancleselectall"android:layout_width="80dp"android:layout_height="fill_parent"android:text="反选"/><Buttonandroid:id="@+id/bt_deselectall"android:layout_width="80dp"android:layout_height="fill_parent"android:text="取消选择"/></LinearLayout><ListViewandroid:id="@+id/lv"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_below="@+id/line"/></RelativeLayout>

listView 的item布局文件:

[html]view plaincopy <?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/item_tv"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_weight="1"/><CheckBoxandroid:id="@+id/item_cb"android:layout_width="wrap_content"android:layout_height="wrap_content"android:clickable="false"android:focusable="false"android:focusableInTouchMode="false"android:gravity="center_vertical"/></LinearLayout>

Activity:

[java]view plaincopy publicclassEx_checkboxActivityextendsActivity{privateListViewlv;privateMyAdaptermAdapter;privateArrayList<String>list;privateButtonbt_selectall;privateButtonbt_cancel;privateButtonbt_deselectall;privateintcheckNum;//记录选中的条目数量privateTextViewtv_show;//用于显示选中的条目数量/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);/*实例化各个控件*/lv=(ListView)findViewById(R.id.lv);bt_selectall=(Button)findViewById(R.id.bt_selectall);bt_cancel=(Button)findViewById(R.id.bt_cancelselectall);bt_deselectall=(Button)findViewById(R.id.bt_deselectall);tv_show=(TextView)findViewById(R.id.tv);list=newArrayList<String>();//为Adapter准备数据initDate();//实例化自定义的MyAdaptermAdapter=newMyAdapter(list,this);//绑定Adapterlv.setAdapter(mAdapter);//全选按钮的回调接口bt_selectall.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){//遍历list的长度,将MyAdapter中的map值全部设为truefor(inti=0;i<list.size();i++){MyAdapter.getIsSelected().put(i,true);}//数量设为list的长度checkNum=list.size();//刷新listview和TextView的显示dataChanged();}});//反选按钮的回调接口bt_cancel.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){//遍历list的长度,将已选的设为未选,未选的设为已选for(inti=0;i<list.size();i++){if(MyAdapter.getIsSelected().get(i)){MyAdapter.getIsSelected().put(i,false);checkNum--;}else{MyAdapter.getIsSelected().put(i,true);checkNum++;}}//刷新listview和TextView的显示dataChanged();}});//取消按钮的回调接口bt_deselectall.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){//遍历list的长度,将已选的按钮设为未选for(inti=0;i<list.size();i++){if(MyAdapter.getIsSelected().get(i)){MyAdapter.getIsSelected().put(i,false);checkNum--;//数量减1}}//刷新listview和TextView的显示dataChanged();}});//绑定listView的监听器lv.setOnItemClickListener(newOnItemClickListener(){@OverridepublicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,longarg3){//取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤ViewHolderholder=(ViewHolder)arg1.getTag();//改变CheckBox的状态holder.cb.toggle();//将CheckBox的选中状况记录下来MyAdapter.getIsSelected().put(arg2,holder.cb.isChecked());//调整选定条目if(holder.cb.isChecked()==true){checkNum++;}else{checkNum--;}//用TextView显示tv_show.setText("已选中"+checkNum+"项");}});}//初始化数据privatevoidinitDate(){for(inti=0;i<15;i++){list.add("data"+""+i);};}//刷新listview和TextView的显示privatevoiddataChanged(){//通知listView刷新mAdapter.notifyDataSetChanged();//TextView显示最新的选中数目tv_show.setText("已选中"+checkNum+"项");};}

列表适配器:

[java]view plaincopy packagecom.notice.listcheck;importjava.util.ArrayList;importjava.util.HashMap;importandroid.content.Context;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.CheckBox;importandroid.widget.TextView;publicclassMyAdapterextendsBaseAdapter{//填充数据的listprivateArrayList<String>list;//用来控制CheckBox的选中状况privatestaticHashMap<Integer,Boolean>isSelected;//上下文privateContextcontext;//用来导入布局privateLayoutInflaterinflater=null;//构造器publicMyAdapter(ArrayList<String>list,Contextcontext){this.context=context;this.list=list;inflater=LayoutInflater.from(context);isSelected=newHashMap<Integer,Boolean>();//初始化数据initDate();}//初始化isSelected的数据privatevoidinitDate(){for(inti=0;i<list.size();i++){getIsSelected().put(i,false);}}@OverridepublicintgetCount(){returnlist.size();}@OverridepublicObjectgetItem(intposition){returnlist.get(position);}@OverridepubliclonggetItemId(intposition){returnposition;}@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){ViewHolderholder=null;if(convertView==null){//获得ViewHolder对象holder=newViewHolder();//导入布局并赋值给convertviewconvertView=inflater.inflate(R.layout.listviewitem,null);holder.tv=(TextView)convertView.findViewById(R.id.item_tv);holder.cb=(CheckBox)convertView.findViewById(R.id.item_cb);//为view设置标签convertView.setTag(holder);}else{//取出holderholder=(ViewHolder)convertView.getTag();}//设置list中TextView的显示holder.tv.setText(list.get(position));//根据isSelected来设置checkbox的选中状况holder.cb.setChecked(getIsSelected().get(position));returnconvertView;}publicstaticHashMap<Integer,Boolean>getIsSelected(){returnisSelected;}publicstaticvoidsetIsSelected(HashMap<Integer,Boolean>isSelected){MyAdapter.isSelected=isSelected;}publicstaticclassViewHolder{TextViewtv;CheckBoxcb;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。