安卓 checkbox 全选

场景:安卓ListView中CheckBox的运用(支持Item列表项的删除,全选,全不选)

安卓ListView中CheckBox的使用(支持Item列表项的删除,全选,全不选)

ListView 自身提供了 CheckBox 只需要添加一行代码

getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

但是这种实现想要自己控制操作起来局限很多。所以我选择了自己添加CheckBox的方式。可以支持列表项的全选,删除,并保持数据的对应关系不会乱。

 

列表中的CheckBox选中状态与一个Map进行绑定,利用 adapter.notifyDataSetChanged();来更新界面。

效果如下:


安卓 checkbox 全选

下面直接看代码把。

 

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

 

资源文件见附件源代码。