Android checkbox的listView(多选,全选,反选)具体实现方法

布局文件:
[html] 


代码如下:

<?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="fill_parent" 
    android:orientation="horizontal" >

<TextView 
        android:id="@+id/tv" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center_vertical" />

<LinearLayout 
        android:id="@+id/line" 
        android:layout_width="fill_parent" 
        android:layout_height="50dp" 
        android:layout_below="@+id/tv" 
        android:orientation="horizontal" >

<Button 
            android:id="@+id/bt_selectall" 
            android:layout_width="80dp" 
            android:layout_height="fill_parent" 
            android:text="全选" />

<Button 
            android:id="@+id/bt_cancleselectall" 
            android:layout_width="80dp" 
            android:layout_height="fill_parent" 
            android:text="反选" />

<Button 
            android:id="@+id/bt_deselectall" 
            android:layout_width="80dp" 
            android:layout_height="fill_parent" 
            android:text="取消选择" />

</LinearLayout>

<ListView 
        android:id="@+id/lv" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:layout_below="@+id/line" />

</RelativeLayout>

listView 的item布局文件:

[html]


代码如下:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" >

<TextView 
        android:id="@+id/item_tv" 
        android:layout_width="0dp" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center_vertical" 
        android:layout_weight="1" />

<CheckBox 
        android: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]


代码如下:

public class Ex_checkboxActivity extends Activity { 
    private ListView lv; 
    private MyAdapter mAdapter; 
    private ArrayList<String> list; 
    private Button bt_selectall; 
    private Button bt_cancel; 
    private Button bt_deselectall; 
    private int checkNum; // 记录选中的条目数量 
    private TextView tv_show;// 用于显示选中的条目数量

/** Called when the activity is first created. */

@Override 
    public void onCreate(Bundle savedInstanceState) { 
        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 = new ArrayList<String>(); 
        // 为Adapter准备数据 
        initDate(); 
        // 实例化自定义的MyAdapter 
        mAdapter = new MyAdapter(list, this); 
        // 绑定Adapter 
        lv.setAdapter(mAdapter);

// 全选按钮的回调接口 
        bt_selectall.setOnClickListener(new OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                // 遍历list的长度,将MyAdapter中的map值全部设为true 
                for (int i = 0; i < list.size(); i++) { 
                    MyAdapter.getIsSelected().put(i, true); 
                } 
                // 数量设为list的长度 
                checkNum = list.size(); 
                // 刷新listview和TextView的显示 
                dataChanged(); 
            } 
        });

// 反选按钮的回调接口 
        bt_cancel.setOnClickListener(new OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                // 遍历list的长度,将已选的设为未选,未选的设为已选 
                for (int i = 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(new OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                // 遍历list的长度,将已选的按钮设为未选 
                for (int i = 0; i < list.size(); i++) { 
                    if (MyAdapter.getIsSelected().get(i)) { 
                        MyAdapter.getIsSelected().put(i, false); 
                        checkNum--;// 数量减1 
                    } 
                } 
                // 刷新listview和TextView的显示 
                dataChanged(); 
            } 
        });

// 绑定listView的监听器 
        lv.setOnItemClickListener(new OnItemClickListener() { 
            @Override 
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
                    long arg3) { 
                // 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤 
                ViewHolder holder = (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 + "项"); 
            } 
        }); 
    }

// 初始化数据 
    private void initDate() { 
        for (int i = 0; i < 15; i++) { 
            list.add("data" + " " + i); 
        }


    // 刷新listview和TextView的显示 
    private void dataChanged() { 
        // 通知listView刷新 
        mAdapter.notifyDataSetChanged(); 
        // TextView显示最新的选中数目 
        tv_show.setText("已选中" + checkNum + "项"); 
    }; 
}

列表适配器:

[java] 


代码如下:

package com.notice.listcheck;

import java.util.ArrayList; 
import java.util.HashMap;

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.TextView;

public class MyAdapter extends BaseAdapter { 
    // 填充数据的list 
    private ArrayList<String> list; 
    // 用来控制CheckBox的选中状况 
    private static HashMap<Integer, Boolean> isSelected; 
    // 上下文 
    private Context context; 
    // 用来导入布局 
    private LayoutInflater inflater = null;

// 构造器 
    public MyAdapter(ArrayList<String> list, Context context) { 
        this.context = context; 
        this.list = list; 
        inflater = LayoutInflater.from(context); 
        isSelected = new HashMap<Integer, Boolean>(); 
        // 初始化数据 
        initDate(); 
    }

// 初始化isSelected的数据 
    private void initDate() { 
        for (int i = 0; i < list.size(); i++) { 
            getIsSelected().put(i, false); 
        } 
    }

@Override 
    public int getCount() { 
        return list.size(); 
    }

@Override 
    public Object getItem(int position) { 
        return list.get(position); 
    }

@Override 
    public long getItemId(int position) { 
        return position; 
    }

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
        ViewHolder holder = null; 
        if (convertView == null) { 
            // 获得ViewHolder对象 
            holder = new ViewHolder(); 
            // 导入布局并赋值给convertview 
            convertView = 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 { 
            // 取出holder 
            holder = (ViewHolder) convertView.getTag(); 
        } 
        // 设置list中TextView的显示 
        holder.tv.setText(list.get(position)); 
        // 根据isSelected来设置checkbox的选中状况 
        holder.cb.setChecked(getIsSelected().get(position)); 
        return convertView; 
    }

public static HashMap<Integer, Boolean> getIsSelected() { 
        return isSelected; 
    }

public static void setIsSelected(HashMap<Integer, Boolean> isSelected) { 
        MyAdapter.isSelected = isSelected; 
    }

public static class ViewHolder { 
        TextView tv; 
        CheckBox cb; 
    } 
}

(0)

相关推荐

  • Android在listview添加checkbox实现原理与代码

    主界面CheckBoxinListViewActivity.java代码如下: 复制代码 代码如下: public class CheckBoxinListViewActivity extends Activity { /** Called when the activity is first created. */ private MyAdapter adapter; private ListView listview; private Button checkAll; private But

  • android开发教程之自定义控件checkbox的样式示例

    主界面xml文件 复制代码 代码如下: <RelativeLayout 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_p

  • Android控件系列之CheckBox使用介绍

    学习目的: 1.掌握在Android中如何建立CheckBox 2.掌握CheckBox的常用属性 3.掌握CheckBox选中状态变换的事件(监听器) CheckBox简介: CheckBox和Button一样,也是一种古老的控件,它的优点在于,不用用户去填写具体的信息,只需轻轻点击,缺点在于只有"是"和"否"两种情况,但我们往往利用它的这个特性,来获取用户的一些信息. 如一个身份表单中,常常让用户填写"是否已经结婚",显然让用户去填写&quo

  • 详解Android Checkbox的使用方法

    0和1是计算机的基础,数理逻辑中0和1代表两种状态,真与假.0和1看似简单,其实变化无穷. 今天我就来聊聊android控件中拥有着0和1这种特性的魔力控件checkbox. 先来讲讲Checkbox的基本使用.在XML中定义. <?xml version="1.0" encoding="utf-8"?> <CheckBox xmlns:android="http://schemas.android.com/apk/res/android

  • Android中CheckBox复选框控件使用方法详解

    CheckBox复选框控件使用方法,具体内容如下 一.简介 1. 2.类结构图 二.CheckBox复选框控件使用方法 这里是使用java代码在LinearLayout里面添加控件 1.新建LinearLayout布局 2.建立CheckBox的XML的Layout文件 3.通过View.inflate()方法创建CheckBox CheckBox checkBox=(CheckBox) View.inflate(this, R.layout.checkbox, null); 4.通过Linea

  • Android中自定义Checkbox组件实例

    在Android中,Checkbox是一个很重要的UI组件,而且在Android中,它展现的形式越来越好看,这就说明有些系统,比如4.0以下,checkbox还是比较不好看,或者跟软件的风格不协调,就需要我们自定义这个组件. 自定义这个组件很简单,简单的增加修改xml文件即可. 准备工作 准备好两张图片,一个是选中的图片,另一个是未选中的图片.本文以checked.png和unchecked.png为例. 设置选择框 在drawable下新建文件custom_checkbox.xml 复制代码

  • Android中ListView结合CheckBox实现数据批量选择(全选、反选、全不选)

    APP的开发中,会常遇到这样的需求:批量取消(删除)List中的数据.这就要求ListVIew支持批量选择.全选.单选等等功能,做一个比较强大的ListView批量选择功能是很有必要的,那如何做呢? 可想而知,要支持批量选择,那CheckBox的使用是不可或缺的,下面,就使用ListView结合CheckBox实现数据的批量选择. 先看下效果图,有图有真相: 先说明接下来要实现的ListView+CheckBox支持的功能:     1.  外部点击"编辑"(长按ListView的某一

  • Android CheckBox 的使用案例分析

    复制代码 代码如下: public class MainActivity extends Activity { TextView tv; CheckBox cb1; CheckBox cb2; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main); cb1 = (Check

  • Android中ListView + CheckBox实现单选、多选效果

    还是先来看看是不是你想要的效果: 不废话,直接上代码,很简单,代码里都有注释 1 单选 public class SingleActivity extends AppCompatActivity { private ListView listView; private ArrayList<String> groups; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInsta

  • android RadioButton和CheckBox组件的使用方法

    RadioButton是单选按钮,多个RadioButton放在一个RadioGroup控件中,也就是说每次只能有1个RadioButton被选中.而CheckBox是多选按钮,Toatst是android中带的一个用于显示提示小窗口消息的控件,其提示的内容过一会儿会自动消失.RadioGroup和CheckBox控件设置监听器都是用的setOnCheckedChangeListener函数,其输入参数是一个函数,且函数内部要实现1个内部类.RadioGroup监听器的输入参数用的是RadioG

随机推荐