checkbox的listView实现多选,全选,反选

简单的布局文件:

<LinearLayout 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_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/tv_check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textColor="#f00"
        android:textSize="25sp"
        android:text="共选中:" />
    <LinearLayout 
        android:layout_width="match_parent"
    	android:layout_height="wrap_content"
        >
        <Button 
	        android:id="@+id/bt_all_select"
	        android:layout_width="match_parent"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:text="全选"
	        />
        <Button 
	        android:id="@+id/bt_invert_select"
	        android:layout_width="match_parent"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:text="反选"
	        />
        <Button 
	        android:id="@+id/bt_cancel_select"
	        android:layout_width="match_parent"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:text="取消选择"
	        />
    </LinearLayout>
    <ListView 
        android:id="@+id/lv_listview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        ></ListView>

</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView 
        android:id="@+id/tv_intro_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:text="aaaa"
        android:textSize="20sp"
        android:layout_marginLeft="10dp"
        />
    <CheckBox 
        android:id="@+id/cb_intro_check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="false"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:layout_centerInParent="true"
        />
    

</RelativeLayout>

ListView的适配器:

package com.baidu.adapter;

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

import com.baidu.checkbox_all.R;

import android.annotation.SuppressLint;
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 CheckAdapter extends BaseAdapter{
	private Context context;
	private ArrayList<String> list;
	private static HashMap<Integer, Boolean> isSelected;

	@SuppressLint("UseSparseArrays")
	public CheckAdapter(Context context, ArrayList<String> list) {
		super();
		this.context = context;
		this.list = list;
		isSelected=new HashMap<Integer, Boolean>();
//		初始化数据
		initData();
	}

	private void initData() {
		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 vh=null;
		if(convertView==null){
			vh=new ViewHolder();
			convertView=LayoutInflater.from(context).inflate(R.layout.listview_intro, null);
			vh.tv_intro_name=(TextView) convertView.findViewById(R.id.tv_intro_name);
			vh.cb_intro_check=(CheckBox) convertView.findViewById(R.id.cb_intro_check);
			
			convertView.setTag(vh);
		}else{
			vh=(ViewHolder) convertView.getTag();
		}
		
		vh.tv_intro_name.setText(list.get(position));
		vh.cb_intro_check.setChecked(getIsSelected().get(position));
		
		return convertView;
	}
	
	public static HashMap<Integer, Boolean> getIsSelected(){
		return isSelected;
	}
	
	public static void isSelected(HashMap<Integer, Boolean> isSelected){
		CheckAdapter.isSelected=isSelected;
	}
	
	public static class ViewHolder{
		public TextView tv_intro_name;
		public CheckBox cb_intro_check;
	}

}
在Activity中的代码:

package com.baidu.checkbox_all;

import java.util.ArrayList;

import com.baidu.adapter.CheckAdapter;
import com.baidu.adapter.CheckAdapter.ViewHolder;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

	private TextView tv_check;
	private Button bt_all_select;
	private Button bt_invert_select;
	private Button bt_cancel_select;
	private ListView lv_listview;
	private CheckAdapter adapter;
	private int checkNum;
	private ArrayList<String> list=new ArrayList<String>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		init();
	}

	private void init() {
		/*
		 * 实例控件对象
		 */
		tv_check=(TextView)findViewById(R.id.tv_check);
		bt_all_select=(Button)findViewById(R.id.bt_all_select);
		bt_invert_select=(Button)findViewById(R.id.bt_invert_select);
		bt_cancel_select=(Button)findViewById(R.id.bt_cancel_select);
		lv_listview=(ListView)findViewById(R.id.lv_listview);
		
//		准备数据
		initData();
//		适配器
		adapter=new CheckAdapter(this, list);
		lv_listview.setAdapter(adapter);
		
//		按钮的监听
		bt_all_select.setOnClickListener(this);
		bt_invert_select.setOnClickListener(this);
		bt_cancel_select.setOnClickListener(this);
		
//		listview的监听器
		lv_listview.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int position,
					long id) {
//				取得viewholder对象
				ViewHolder vh=(ViewHolder) arg1.getTag();
//				改变checkbox的状态
				vh.cb_intro_check.toggle();
//				将CheckBox的选中状况记录下来  
				CheckAdapter.getIsSelected().put(position, vh.cb_intro_check.isChecked());
//				调整选中的项目
				if(vh.cb_intro_check.isChecked()==true){
					checkNum++;
				}else{
					checkNum--;
				}
//				显示选中的条数
				tv_check.setText("已选中"+checkNum+"项!");
			}
		});
	}

	private void initData() {
		for(int i=0;i<20;i++){
			list.add("商品"+""+i);
		}
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.bt_all_select:
//			遍历listview的长度,将map中的值设为true
			for(int i=0;i<list.size();i++){
				CheckAdapter.getIsSelected().put(i, true);
			}
//			数量设为list的长度
			checkNum=list.size();
//			刷新listview和textview的显示
			dataChanged();
			break;
		case R.id.bt_invert_select:
//			遍历list的长度,将已选的设为未选,未选的设为已选  
			for(int i=0;i<list.size();i++){
				if(CheckAdapter.getIsSelected().get(i)){
					CheckAdapter.getIsSelected().put(i, false);
					checkNum--;
				}else{
					CheckAdapter.getIsSelected().put(i, true);
					checkNum++;
				}
			}
//			刷新listview和textview的显示
			dataChanged();
			break;
		case R.id.bt_cancel_select:
//			遍历list的长度,将已选的按钮设为未选  
			for(int i=0;i<list.size();i++){
				if(CheckAdapter.getIsSelected().get(i)){
					CheckAdapter.getIsSelected().put(i, false);
					checkNum--;
				}
			}
//			刷新listview和textview的显示
			dataChanged();
			break;

		default:
			break;
		}
	}
//	刷新listview和textview的显示
	private void dataChanged(){
//		通知listview刷新
		adapter.notifyDataSetChanged();
//		textview显示最新的选中项目
		tv_check.setText("已选中"+checkNum+"项!");
	}

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值