checkbox使用

本文介绍了如何在Android中自定义Checkbox,包括设置选中和未选中的图片状态,以及创建一个selector资源。接着,展示了如何结合GridView实现全选和反选功能,通过自定义Adapter和设置布局文件,实现数据的保存与操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、自定义一个checkbox

首先准备2张图片,代表选中时和未选中的状态。

写一个selector,命名为check_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/ic_checkbox_checked" android:state_checked="true"></item>
    <item android:drawable="@drawable/ic_checkbox_unchecked" android:state_checked="false"></item>
	<item android:drawable="@drawable/ic_checkbox_unchecked"/> 
</selector>

在style.xml中定义checkbox的样式

<style name="CustomCheckboxTheme" parent="@android:style/Widget.CompoundButton.CheckBox">  
    <item name="android:button">@drawable/check_selector</item>  
</style>
在布局文件中使用该样式

<CheckBox
    android:layout_width="28dp"
    android:layout_height="28dp"
    style="@style/CustomCheckboxTheme"
    />
经过以上步骤就自定义了一个checkbox。

2、结合GridView实现全选等效果

直接上例子说明,肯定先得有一个gridview了

<GridView 
        android:id="@+id/nmdetail_gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="2"
        ></GridView>
然后在界面中找到它GridView nmdetail_gridview = (GridView) findViewById(R.id.nmdetail_gridview);备用

关键的部分是adapter怎么弄,下面我们一起看一看:

先把adapter所需加载的布局文件写好,文件名是detail_gridview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    	xmlns:android="http://schemas.android.com/apk/res/android"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
    	>
<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:paddingTop="4dp"
        android:paddingBottom="4dp" >

        <ImageView
            android:id="@+id/gridview_item_qcb"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_alignParentLeft="true"
            android:src="@drawable/ic_contact_picture_180_holo_dark" />

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/gridview_item_qcb"
            android:layout_marginLeft="10dp"
            android:gravity="center_vertical"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/gridview_item_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:singleLine="true"
                android:text="werw"
                android:textAppearance="?android:textAppearanceLarge"
                android:textColor="#000000" />

            <TextView
                android:id="@+id/gridview_item_number"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="1dp"
                android:singleLine="true"
                android:text="123342"
                android:textAppearance="?android:textAppearanceMedium"
                android:textColor="#000000" />
        </LinearLayout>

        <CheckBox
            android:id="@+id/gridview_item_select"
            android:layout_width="28dp"
            android:layout_height="28dp"
            android:layout_alignRight="@+id/gridview_item_qcb"
            android:layout_alignBottom="@+id/gridview_item_qcb"
	    style="@style/CustomCheckboxTheme"
	    android:clickable="false"
	    android:focusable="false"
	    android:focusableInTouchMode="false"
            />

</RelativeLayout>
</LinearLayout>

建立一个adapter类,直接上代码了,文件名是DetailGridViewAdapter

public class DetailGridViewAdapter extends BaseAdapter{

	private Context context;
	private List<SelectContactBean> list;
	
	private static HashMap<Integer,Boolean> isSelected;
	
	public DetailGridViewAdapter(Context context, List<SelectContactBean> list) {
		this.context = context;
		this.list = list;
		
		isSelected = new HashMap<Integer, Boolean>();
		for(int i=0; i<list.size();i++) {
            getIsSelected().put(i,false);
        }
	}
	
	public static HashMap<Integer,Boolean> getIsSelected() {
        return isSelected;
    }

    public static void setIsSelected(HashMap<Integer,Boolean> isSelected) {
    	DetailGridViewAdapter.isSelected = isSelected;
    }
	
	@Override
	public int getCount() {
		return list.size();
	}

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

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder holder;
		if (convertView == null) {
			convertView = LayoutInflater.from(context).inflate(R.layout.detail_gridview_item, null);
			holder = new ViewHolder();
			
			holder.name = (TextView) convertView.findViewById(R.id.gridview_item_name);
			holder.number = (TextView) convertView.findViewById(R.id.gridview_item_number);
			holder.select = (CheckBox) convertView.findViewById(R.id.gridview_item_select);
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		
		SelectContactBean contact = list.get(position);
		String name = contact.getDesplayName();
		String number = contact.getPhoneNum();
		holder.name.setText(name);
		holder.number.setText(number);
		holder.select.setChecked(getIsSelected().get(position));
		return convertView;
	}
	
	public class ViewHolder {
		
		TextView name;
		TextView number;
		CheckBox select;
	}

}



其实我们主要就是为了得到这个map中的数据,因为选择之后经常会跳转到别的页面进行显示或操作,有了这个保存状态就方便操作了

最后给gridview把这个adapter置上去就行了。

adapter = new DetailGridViewAdapter(NMDetailActivity.this, dataList);
		nmdetail_gridview.setAdapter(adapter);
		
		nmdetail_gridview.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int position,
					long arg3) {
				DetailGridViewAdapter.ViewHolder holder = (DetailGridViewAdapter.ViewHolder) arg1.getTag();
				holder.select.toggle();
				if(holder.select.isChecked()) {
					DetailGridViewAdapter.getIsSelected().put(position, true);
				}
			}
		});


全选与反选功能的实现:

private boolean bool = true;

case R.id.nmdetail_btn_selectall:
				if(bool) {
					for (int i = 0; i < dataList.size(); i++) {
						DetailGridViewAdapter.getIsSelected().put(i, true);
						adapter.notifyDataSetChanged();
					}
					bool = false;
					nmdetail_btn_selectall.setText("反选");
					
				}else {
					for (int i = 0; i < dataList.size(); i++) {
						DetailGridViewAdapter.getIsSelected().put(i, false);
						adapter.notifyDataSetChanged();
					}
					bool = true;
					nmdetail_btn_selectall.setText("全选");
				}
				
				break;

以上代码就实现了全选与反选。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值