安卓ListView中CheckBox的使用(支持Item列表项的删除,全选,全不选)
ListView 自身提供了 CheckBox 只需要添加一行代码
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
但是这种实现想要自己控制操作起来局限很多。所以我选择了自己添加CheckBox的方式。可以支持列表项的全选,删除,并保持数据的对应关系不会乱。
列表中的CheckBox选中状态与一个Map进行绑定,利用 adapter.notifyDataSetChanged();来更新界面。
效果如下:
下面直接看代码把。
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#C9F1FF">
- <ListView
- android:id="@id/android:list"
- android:layout_height="wrap_content"
- android:layout_width="fill_parent"
- android:fadingEdge="none"
- android:cacheColorHint="#00000000"/>
- <RelativeLayout
- android:layout_width="fill_parent"
- android:layout_height="40.0dip"
- android:layout_alignParentBottom="true">
- <CheckBox android:id="@+id/all_check_btn"
- android:layout_width="40.0dip"
- android:background="@drawable/bottom_back_bg"
- android:layout_height="40.0dip"
- android:layout_alignParentLeft="true"/>
- </RelativeLayout>
- </RelativeLayout>
item.xml
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent" android:layout_height="wrap_content"
- android:layout_marginRight="3.0dip" android:layout_weight="1.0"
- android:orientation="horizontal" android:descendantFocusability="blocksDescendants">
- <CheckBox android:id="@+id/isCheakBox" android:layout_width="wrap_content" android:layout_height="wrap_content"
- android:layout_alignParentLeft="true" />
- <!-- 日报图片 -->
- <ImageView android:id="@+id/dailyPic" android:contentDescription="dailyPic"
- android:layout_width="wrap_content" android:layout_height="wrap_content"
- android:layout_marginTop="3.0dip" android:src="@drawable/reports"
- android:layout_toRightOf="@id/isCheakBox" android:layout_centerVertical="true"/>
- <!--附件名称 -->
- <TextView
- android:id="@+id/dailyName"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/dailyPic"
- android:text="日报名称" android:layout_centerVertical="true"
- android:textColor="#000000"
- android:textSize="12.0sp" />
- <ImageButton android:id="@+id/deleteAttachment"
- android:layout_width="wrap_content" android:layout_height="wrap_content"
- android:layout_marginTop="3.0dip" android:background="@drawable/delete"
- android:layout_centerVertical="true" android:focusable="false"
- android:layout_alignParentRight="true" android:layout_marginRight="20dp"/>
- <!--附件名称 -->
- </RelativeLayout>
Activity代码
- public class ListViewCheckBoxActivity extends ListActivity {
- private static final String TAG = "ListViewCheckBoxActivity";
- private List<Item> itemList;
- private DraftDailyAdapter adapter;
- private Map<Integer, Boolean> isCheckedMap;
- private CheckBox allCheckBox;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- allCheckBox = (CheckBox)findViewById(R.id.all_check_btn);
- itemList = new ArrayList<Item>();
- isCheckedMap = new HashMap<Integer, Boolean>();
- //初始化数据
- for(int i=0;i<8;i++){
- Item item = new Item();
- item.id=i;
- item.name = "第"+i+"篇日报";
- itemList.add(item);
- isCheckedMap.put(i,false);
- }
- adapter = new DraftDailyAdapter(this,itemList);
- setListAdapter(adapter);
- allCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- Set<Integer> set = isCheckedMap.keySet();
- Iterator<Integer> iterator = set.iterator();
- if(isChecked){
- while(iterator.hasNext()){
- Integer keyId = iterator.next();
- isCheckedMap.put(keyId,true);
- }
- }else{
- while(iterator.hasNext()){
- Integer keyId = iterator.next();
- isCheckedMap.put(keyId,false);
- }
- }
- adapter.notifyDataSetChanged();
- }
- });
- }
- class DraftDailyAdapter extends BaseAdapter {
- public List<Item> list;
- private Context context;
- LayoutInflater inflater;
- public DraftDailyAdapter(Context context, List<Item> list) {
- super();
- this.list = list;
- this.context = context;
- inflater = LayoutInflater.from(this.context);
- }
- @Override
- public int getCount() {
- return list == null ? 0 : list.size();
- }
- @Override
- public Object getItem(int location) {
- return list.get(location);
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder = null;
- Item item = list.get(position);
- //Item的位置
- final int listPosition = position;
- //这个记录item的id用于操作isCheckedMap来更新CheckBox的状态
- final int id = item.id;
- if(convertView == null){
- holder = new ViewHolder();
- convertView = inflater.inflate(R.layout.item, null);
- holder.tvName = (TextView)convertView.findViewById(R.id.dailyName);
- holder.deleteButton = (ImageButton)convertView.findViewById(R.id.deleteAttachment);
- holder.cBox = (CheckBox)convertView.findViewById(R.id.isCheakBox);
- convertView.setTag(holder);
- }else{
- holder = (ViewHolder) convertView.getTag();
- }
- Log.d(TAG, "id="+id);
- holder.cBox.setChecked(isCheckedMap.get(id));
- holder.tvName.setText(item.name);
- holder.deleteButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View paramView) {
- //Log.d(TAG, "deletePosition="+listPosition+"");
- //删除list中的数据
- list.remove(listPosition);
- //删除Map中对应选中状态数据
- isCheckedMap.remove(id);
- //通知列表数据修改
- adapter.notifyDataSetChanged();
- }
- });
- holder.cBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- if(isChecked){
- isCheckedMap.put(id,true);
- }else{
- isCheckedMap.put(id,false);
- }
- }
- });
- return convertView;
- }
- public final class ViewHolder {
- public TextView tvName;
- public ImageButton deleteButton;
- public CheckBox cBox;
- }
- }
- class Item {
- private Integer id;
- private String name;
- }
- }
资源文件见附件源代码。
安卓ListView中CheckBox的使用(支持Item列表项的删除,全选,全不选)的更多相关文章
- 我的Android进阶之旅------>Android【设置】-【语言和输入法】-【语言】列表中找到相应语言所对应的列表项
今天接到一个波兰的客户说有个APP在英文状态下一切运行正常,但是当系统语言切换到波兰语言的时候,程序奔溃了.所以首先我得把系统的语言切换到波兰语,问题是哪个是波兰语呢? 我还真的不认识哪个列表项代表着 ...
- 实现listview中checkbox的多选与记录
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...
- android UI进阶之实现listview中checkbox的多选与记录
今天继续和大家分享涉及到listview的内容.在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作.比如在一个 清单页面,我们需要记录用户勾选了哪些条目.这个的实现并 ...
- 【转】android UI进阶之实现listview中checkbox的多选与记录--不错
原文网址:http://www.cnblogs.com/notice520/archive/2012/02/17/2355415.html 今天继续和大家分享涉及到listview的内容.在很多时候, ...
- android ListView中CheckBox错位的解决
貌似已经非常晚了,可是还是想记下笔记,想让今天完满. 在ListView中加了checkBox,但是发现点击改变其选中状态的时候,发现其位置错乱.状态改变的并非你选中的,百思不得其解.后面通过上网查资 ...
- ListView中CheckBox使用问题
因为CheckBox的点击事件优先级比ListView的高,所以当ListView中使用CheckBox会导致ListView的setOnItemClickListener失去响应. 解决的方法:在C ...
- 抛砖引玉:关于Android的ListView中CheckBox错乱
首先:参考了这篇翻译的文章:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html 文章中关于说的Android中的Recyc ...
- Android 解决listview中checkBox错位选择
假如ListView,分成2页(或者设置数据可以纵向拉,可隐藏),每页3条数据,每个Listview的Item 里面有个checkBox,现在,当我选择第一页的前两天数据,翻到第二页,竟然第二页后两条 ...
- ListView中CheckBox错乱解决
思路: ListView在复用的时候会出现很多问题,CheckBox状态会出现错乱,解决思路: 1.使用Map集合的键值对的形式来存放position位置上CheckBox的状态 2.监听CheckB ...
随机推荐
- oauth2-server-php-docs 授权控制器
授权控制器 概观 对于授权端点,要求用户使用authorization code(授权码授权类型)或access token(隐式授权类型)对客户端进行认证和重定向. 方法 handleAuthori ...
- GPUImage简单滤镜使用之色阶(三)
色阶是表示图像亮度强弱的指数标准,图像的色彩丰满度和精细度是由色阶决定的.在GPUImage中GPUImageLevelsFilter提供了此功能. GPUImageLevelsFilter定义了修改 ...
- Springmvc 上传文件MultipartFile 转File
转自:http://blog.csdn.net/boneix/article/details/51303207 业务场景:ssm框架 上传文件到应用服务器过程中要传到专有的文件服务器并返回url进行其 ...
- linux免密码登录
ssh-copy-id 命令 可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh ...
- ASP输出JSON数据及客户端jQuery处理方法
首先ASP处理JSON需要json官方提供的JSON For ASP 封装类文件,下载地址:http://code.google.com/p/aspjson/downloads/list 下载最新的J ...
- 如何设置iPhone的手机铃声?【来自星星的你】
如果大家需要已经截取好的手机铃声,可以给我留言,写下邮箱号码. 谢谢. ---------------------------------------------------------------- ...
- LintCode: Search A 2d Matrix
1. 设查找的数位y,第一行最后一列的数位x 如果x<y,x是第一行最大的,所以第一行都小于y,删除第一行: 如果x>y,x是最后一列最小的,所以最后一列都大于y,删除最后一列: 这样保证 ...
- 【树莓派】树莓派与XBMC及Kodi、LibreELEC插件(二)
之前的相关文章参考: [树莓派]树莓派与XBMC及Kodi.LibreELEC插件(一) [树莓派]树莓派与XBMC及Kodi.LibreELEC插件(二) [树莓派]树莓派与XBMC及Kodi.Li ...
- Go语言中使用SQLite数据库
Go语言中使用SQLite数据库 1.驱动 Go支持sqlite的驱动也比较多,但是好多都是不支持database/sql接口的 https://github.com/mattn/go-sqlite3 ...
- 一个JAVA的WEB服务器事例
其实编写一个入门级别的JAVA的WEB服务器,很简单,用SOCKET类即可实现.相关内容可以参考:http://www.cnblogs.com/liqiu/p/3253022.html 一.首先创建一 ...