天天看點

checkbox的listView 實作多選,全選,反選

主函數<span style="font-family: Arial, Helvetica, sans-serif;">Activity的設定</span>
           
import java.util.ArrayList;

import com.example.all_other.MyAdapter.ViewHolder;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
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 {
	   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.activity_main);  
	        /* 執行個體化各個控件 */  
	        lv = (ListView) findViewById(R.id.lv);  
	        bt_selectall = (Button) findViewById(R.id.bt_selectall);  
	        bt_cancel = (Button) findViewById(R.id.bt_cancleselectall);  
	        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 + "項");  
	    };  
	}  
           

擴充卡Adapter

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;  
    }  
}  
           

主函數界面的布局

<?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>  
           

适i配器界面listview_ltem

<?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>
           
listview_ltem中的一些屬性說明

 
 
  ====================================================
 
 
       可點選的
 
 
          android:clickable="false"
 
 
      可聚焦的    
 
 
          android:focusable="false"
 
 
      就是可以通過touch來獲得focus(聚焦)
 
 
          android:focusableInTouchMode="false"
       

繼續閱讀