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;
以上代码就实现了全选与反选。