selectAll___CheckBox in ListView

1.如果你有一个ListView,listView的 adapter 是自定义的,并且item中包含一个CheckBox 跟其他的一些组件,
如果你想通过额外一的一个CheckBox来实现select All 跟dis select all 以及 手动 选择的话,可参照下面的实现方式。
merge_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="4dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:layout_alignParentLeft="true">

<RelativeLayout
android:id="@+id/avatarLayout_1"
android:layout_width="60dip"
android:layout_height="60dip"
android:background="@drawable/frame">
<ImageView
android:id="@+id/avatar_1"
android:layout_width="60dip"
android:layout_height="60dip"
android:layout_alignParentLeft="true"
android:src="@drawable/default_avatar" />

<ImageView
android:id="@+id/sns_type_icon_1"
android:layout_width="25dip"
android:layout_height="25dip"
android:paddingRight="5dip"
android:paddingLeft="3dip"
android:layout_alignBottom="@id/avatar_1"
android:layout_alignRight="@id/avatar_1"
/>
</RelativeLayout>


<TextView
android:layout_below="@+id/item"
android:layout_toRightOf="@+id/avatarLayout_1"
android:layout_centerVertical="true"
android:paddingLeft="1dip"
android:id="@+id/name_1"
android:layout_width="60dip"
android:layout_height="wrap_content"
android:textSize="18dip"
android:layout_weight="1"
android:textColor="#ffffff"
android:text="Contact1" />
</LinearLayout>
<CheckBox
android:id="@+id/link"
android:layout_centerHorizontal="true"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right"
android:layout_alignParentRight="true">
<TextView
android:layout_below="@+id/item"
android:layout_centerVertical="true"
android:paddingRight="1dip"
android:id="@+id/name_2"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:textSize="18dip"
android:layout_weight="1"
android:textColor="#ffffff"
android:text="Contact2" />

<RelativeLayout
android:id="@+id/avatarLayout_2"
android:layout_width="60dip"
android:layout_height="60dip"
android:background="@drawable/frame">
<ImageView
android:id="@+id/avatar_2"
android:layout_width="60dip"
android:layout_height="60dip"
android:layout_alignParentLeft="true"
android:src="@drawable/default_avatar" />

<ImageView
android:id="@+id/sns_type_icon_2"
android:layout_width="25dip"
android:layout_height="25dip"
android:paddingRight="5dip"
android:paddingLeft="3dip"
android:layout_alignBottom="@id/avatar_2"
android:layout_alignRight="@id/avatar_2"
/>
</RelativeLayout>
</LinearLayout>
</RelativeLayout>


MergeListActivity.java
public class MergeListActivity extends Activity{
public MergeListAdapter mAdapter;
ListView mergeListView;




/* (non-Javadoc)
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.merge_list);
initMergeList();
super.onCreate(savedInstanceState);
}


public void initMergeList(){
MyLog.println("MergeListActivity.initMergeList");

// get the list view
final ListView mergeListView = ((ListView) findViewById(R.id.merge_list));
mAdapter = new MergeListAdapter(this);
//add header
if (mergeListView.getHeaderViewsCount() == 0){
final RelativeLayout header = (RelativeLayout) LayoutInflater.from(MergeListActivity.this) .inflate(R.layout.merge_list_header, null);
mergeListView.addHeaderView(header);
final CheckBox selectAll = (CheckBox)header.findViewById(R.id.selectedAll);
selectAll.setOnCheckedChangeListener(new OnCheckedChangeListener(){

@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
//mergeListView.setSelected(true);
mAdapter.setAllChecked(isChecked);
}
});

final Button cancel = (Button)findViewById(R.id.btn_cancel);
cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});

final Button ok = (Button)findViewById(R.id.btn_ok);
ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mAdapter.autoMergeSelectItems();
finish();
}
});
}

mergeListView.setAdapter(mAdapter);

}

}


MergeListAdapter.java
public class MergeListAdapter extends BaseAdapter {  
private Context mContext;
public static ArrayList<SimpleContact> similar_1;
public static ArrayList<SimpleContact> similar_2;
public static LayoutInflater inflater = null;
private ArrayList<Boolean> checkBoxStateList = new ArrayList<Boolean>();
private ArrayList<CheckBox> ctv = new ArrayList<CheckBox>();


public MergeListAdapter(Context context) {
mContext = context;
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
for(int i = 0; i < similar_1.size(); i++){
checkBoxStateList.add(i,false);
}

}
public int getCount() {
return similar_1.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}

private void onClickItem(int position){
MyLog.println("MergeListActivity.onClickItem");
final int contactID1 = Integer.parseInt(similar_1.get(position).contactID);
final int contactID2 = Integer.parseInt(similar_2.get(position).contactID);
Intent itent = new Intent(mContext,MergeDetailActivity.class);
itent.putExtra(IntentExtraName.EXTRA_PRIMARY_CONTACT_ID_NAME, contactID1);
itent.putExtra(IntentExtraName.EXTRA_SECONDARY_CONTACT_ID_NAME, contactID2);
mContext.startActivity(itent);
}

public static class ViewHolder{
public ImageView avatar_1;
public ImageView avatar_2;
public TextView name_1;
public TextView name_2;
public ImageView snsTypeIcon_1;
public ImageView snsTypeIcon_2;
public CheckBox checkBox;
}
public View getView(
final int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder holder;
if(convertView==null) {
row = inflater.inflate(R.layout.merge_list_item, parent, false);
holder = new ViewHolder();
holder.avatar_1 = (ImageView)row.findViewById(R.id.avatar_1);
holder.name_1 = (TextView)row.findViewById(R.id.name_1);
holder.snsTypeIcon_1 = (ImageView)row.findViewById(R.id.sns_type_icon_1);
holder.checkBox = (CheckBox)row.findViewById(R.id.link);
holder.avatar_2 = (ImageView)row.findViewById(R.id.avatar_2);
holder.name_2 = (TextView)row.findViewById(R.id.name_2);
holder.snsTypeIcon_2 = (ImageView)row.findViewById(R.id.sns_type_icon_2);
holder.checkBox.setTag(position);
row.setTag(holder);
}else{
holder = (ViewHolder)row.getTag();
}



final SimpleContact contact1 = similar_1.get(position);
final SimpleContact contact2 = similar_2.get(position);
final ContentResolver cr = mContext.getContentResolver();
final Bitmap avater_1 = DataOperations.getAvatar(Long.parseLong(contact1.contactID), cr);
final String name_1 = contact1.displayName;

final Bitmap avater_2 = DataOperations.getAvatar(Long.parseLong(contact2.contactID),cr );
final String name_2 = contact2.displayName;

//avatar
if (avater_1 != null){
holder.avatar_1.setImageBitmap(avater_1);
}else{
holder.avatar_1.setBackgroundResource(R.drawable.default_avatar);
}
if (avater_2 != null){
holder.avatar_2.setImageBitmap(avater_2);
}else{
holder.avatar_2.setBackgroundResource(R.drawable.default_avatar);
}

//name
holder.name_1.setText(name_1);
holder.name_2.setText(name_2);

//icon of snsType
if (RichContactConfig.CONTACT_TYPE_FACEBOOK == Integer.parseInt(contact1.contactType)){
holder.snsTypeIcon_1.setImageResource(R.drawable.facebook_s);
}else if (RichContactConfig.CONTACT_TYPE_SINA == Integer.parseInt(contact1.contactType)){
holder.snsTypeIcon_1.setImageResource(R.drawable.sina_s);
}
if (RichContactConfig.CONTACT_TYPE_FACEBOOK == Integer.parseInt(contact2.contactType)){
holder.snsTypeIcon_2.setImageResource(R.drawable.facebook_s);
}else if (RichContactConfig.CONTACT_TYPE_SINA == Integer.parseInt(contact2.contactType)){
holder.snsTypeIcon_2.setImageResource(R.drawable.sina_s);
}

ctv.add(holder.checkBox);
holder.checkBox.setChecked(checkBoxStateList.get(position));
holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if(isChecked){
checkBoxStateList.set(position, true);
} else {
checkBoxStateList.set(position,false);
} }
});


final int index = position;
row.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
onClickItem(index);

}
});

row.setId(position);
return row;
}



public boolean isChecked(int position) {
return checkBoxStateList.get(position);
}

public void setAllChecked(boolean isChecked) {
if(isChecked) {
for(int i = 0; i < ctv.size(); i++){
ctv.get(i).setChecked(true);
}
}else {
for(int i = 0; i < ctv.size(); i++) {
ctv.get(i).setChecked(false);
}
}
}

public ArrayList<Boolean> getCheckBoxStateList() {
return checkBoxStateList;
}

public void autoMergeSelectItems(){
MyLog.println("MergeListActivity.autoMergeSelectItems");

}


}


实现效果:
全选
[img]http://dl.iteye.com/upload/attachment/474666/993f8267-c827-3711-bc24-230636d81dad.png[/img]

全不选
[img]http://dl.iteye.com/upload/attachment/474644/09625bab-2414-3296-9512-5a2cb1e782ac.png[/img]

全选后再手动去除几个
[img]http://dl.iteye.com/upload/attachment/474702/2b698f74-568a-3390-b7fa-509f868b83fc.png[/img]
删除之类操作需要全选功能,方便选择 public class MainActivity extends Activity { private ListView lv; private MyAdapter mAdapter; private ArrayList 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_cancelselectall); // bt_deselectall = (Button) findViewById(R.id.bt_deselectall); tv_show = (TextView) findViewById(R.id.tv); list = new ArrayList(); // 为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.siz
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值