Android实现ListView控件的多选和全选功能实例
本文实例讲述了android实现listview控件的多选和全选功能。分享给大家供大家参考,具体如下:
主程序代码
mainactivity.java
package yy.test; import java.util.arraylist; import android.app.activity; import android.graphics.color; import android.os.bundle; import android.view.menu; import android.view.menuitem; import android.view.submenu; import android.view.view; import android.widget.adapterview; import android.widget.adapterview.onitemclicklistener; import android.widget.checkbox; import android.widget.listadapter; import android.widget.listview; import android.widget.textview; import android.widget.toast; public class mainactivity extends activity { private listview listview; private myadapter adapter; private arraylist<string> items; //模拟存储信息的集合 private arraylist<string> checked; //该集合存储被选中的列表项中的textview中所显示的字符串 private boolean ismultiple = false; // 记录是否是多选状态,true为是,false不是 @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); listview = (listview) findviewbyid(r.id.listview); items = new arraylist<string>(); items.add("00000"); items.add("11111"); items.add("22222"); items.add("33333"); items.add("44444"); items.add("55555"); items.add("66666"); items.add("77777"); items.add("88888"); items.add("99999"); items.add("aaaaa"); items.add("bbbbb"); items.add("ccccc"); items.add("ddddd"); adapter = new myadapter(items,this); //new出自定义的myadapter对象 listview.setadapter(adapter); listview.setonitemclicklistener(new onitemclicklistener() { @override public void onitemclick(adapterview<?> arg0, view view, int position, long arg3) { if(ismultiple){ checkbox checkbox = (checkbox) view.findviewbyid(r.id.checkbox); textview textview = (textview) view.findviewbyid(r.id.text); if(checkbox.ischecked()){ checkbox.setchecked(false); adapter.checkedmap.put(position, false); textview.settextcolor(color.white); adapter.colormap.put(position, color.white); int index = checked.indexof(textview.gettext()+""); checked.remove(index); }else{ checkbox.setchecked(true); adapter.checkedmap.put(position, true); textview.settextcolor(color.red); adapter.colormap.put(position, color.red); checked.add(textview.gettext()+""); } } } }); } @override public boolean oncreateoptionsmenu(menu menu) { submenu submenu = menu.addsubmenu("操作"); submenu.add(0, 1, 0, "多选"); submenu.add(0, 2, 0, "删除"); submenu.add(0, 3, 0, "全选"); submenu.add(0, 4, 0, "取消全选"); return super.oncreateoptionsmenu(menu); } @override public boolean onoptionsitemselected(menuitem item) { if(item.getitemid()==1){ ismultiple = true; checked = new arraylist<string>(); int index = adapter.getcount(); for(int i=0;i<index;i++){ adapter.visiblemap.put(i, checkbox.visible); } adapter.notifydatasetchanged(); }else if(item.getitemid()==2){ for(string text : checked){ int index = items.indexof(text); items.remove(index); } ismultiple = false; adapter = new myadapter(items,mainactivity.this); listview.setadapter(adapter); }else if(item.getitemid()==3){ ismultiple = true; checked = new arraylist<string>(); int index = adapter.getcount(); for(int i=0;i<index;i++){ adapter.checkedmap.put(i, true); adapter.colormap.put(i, color.red); adapter.visiblemap.put(i, checkbox.visible); view view1 = adapter.getview(i, null, null); textview textview = (textview) view1.findviewbyid(r.id.text); textview.settextcolor(color.red); /*checkbox checkbox = (checkbox) view1.findviewbyid(r.id.checkbox); checkbox.setvisibility(checkbox.visible);*/ adapter.notifydatasetchanged(); checked.add(textview.gettext()+""); } }else if(item.getitemid()==4){ ismultiple = false; checked = null; int index = adapter.getcount(); for(int i=0;i<index;i++){ adapter.checkedmap.put(i, false); adapter.colormap.put(i, color.white); adapter.visiblemap.put(i, checkbox.invisible); /*view view1 = adapter.getview(i, null, null); textview textview = (textview) view1.findviewbyid(r.id.text); textview.settextcolor(color.white); checkbox checkbox = (checkbox) view1.findviewbyid(r.id.checkbox); checkbox.setvisibility(checkbox.invisible);*/ adapter.notifydatasetchanged(); } } return super.onoptionsitemselected(item); } }
继承自baseadapter的myadapter
package yy.test; import java.util.arraylist; import java.util.hashmap; import java.util.map; import android.content.context; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.graphics.color; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.baseadapter; import android.widget.checkbox; import android.widget.imageview; import android.widget.textview; public class myadapter extends baseadapter { private layoutinflater inflater; private arraylist<string> items; private bitmap icon; private context context; public map<integer,boolean> checkedmap; //保存checkbox是否被选中的状态 public map<integer,integer> colormap; //保存textview中文字的状态 public map<integer,integer> visiblemap; //保存checkbox是否显示的状态 public myadapter(arraylist<string> items, context context) { super(); this.items = items; this.context = context; inflater = layoutinflater.from(context); icon = bitmapfactory.decoderesource(context.getresources(), r.drawable.icon); checkedmap = new hashmap<integer, boolean>(); colormap = new hashmap<integer, integer>(); visiblemap = new hashmap<integer, integer>(); for(int i=0;i<items.size();i++){ checkedmap.put(i, false); colormap.put(i, color.white); visiblemap.put(i, checkbox.invisible); } } @override public int getcount() { // todo auto-generated method stub return items.size(); } @override public object getitem(int arg0) { // todo auto-generated method stub return arg0; } @override public long getitemid(int arg0) { // todo auto-generated method stub return arg0; } @override public view getview(int position, view view, viewgroup arg2) { view = inflater.inflate(r.layout.file_row, null); imageview image = (imageview) view.findviewbyid(r.id.icon); textview text = (textview) view.findviewbyid(r.id.text); checkbox checkbox = (checkbox) view.findviewbyid(r.id.checkbox); checkbox.setvisibility(visiblemap.get(position)); checkbox.setchecked(checkedmap.get(position)); image.setimagebitmap(icon); text.settext(items.get(position)); text.settextcolor(colormap.get(position)); return view; } }
主界面的布局文件
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <listview android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </linearlayout>
myadapter中所使用的布局文件
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" > <imageview android:id="@+id/icon" android:layout_width="30dp" android:layout_height="30dp" android:layout_gravity="center_vertical" /> <textview android:id="@+id/text" android:layout_width="80dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingleft="5dp" /> <checkbox android:id="@+id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="false" android:clickable="false" android:focusableintouchmode="false" /> </linearlayout>
下面来分析为什么要用map来保存checkbox以及textview的状态。
这个与listview的刷新机制有关,当你的listview对象很多的时候,每次你拖动listview上下滚动,listview都会刷新一次。怎么刷新呢?比如一个屏幕它最多只显示七条listview,如果你有十条数据,当你想看第八条时,第一条数据理所当然的要被隐藏掉,而第八条数据会被显示,这时listview就刷新了。如果你不保存你所选的checkbox的状态,这时如果你选的是第一条的checkbox的状态为true,当你把余下的第八、第九、第十条数据显示出来时,第十条的checkbox的状态会显示为true,但是它的状态没有被保存,只是你看到它是被选中了而已,其实你选的还是第一条数据。这个问题很操蛋。还有一个更离奇的状态,你让checkbox的状态为true,数据一定要大于十条,你不停的上下拖动屏幕,你会看见checkbox的显示状态会乱跳,但是你实际上选择的还是第一条数据,只是会让你的用户感觉很不爽罢了。
更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android布局layout技巧总结》、《android视图view技巧总结》、《android编程之activity操作技巧总结》、《android操作json格式数据技巧总结》、《android资源操作技巧汇总》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。
上一篇: 感情背后需要了解的事情
下一篇: 全面剖析:为什么你的挽回前男友不成功?
推荐阅读
-
Android checkbox的listView(多选,全选,反选)具体实现方法
-
Android Recyclerview实现多选,单选,全选,反选,批量删除的功能
-
Android实现ListView控件的多选和全选功能实例
-
android 实现ListView嵌套Checkbox实现真正的多选、全选、反选、取消
-
android自定义ListView实现底部View自动隐藏和消失的功能
-
Android实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
-
Android 实现自定义圆形listview功能的实例代码
-
Android实现ListView控件的多选和全选功能实例
-
基于vue.js实现checkbox的全选和批量删除功能实例代码
-
javascript+bootstrap+html实现层级多选框全层全选和多选功能代码实例