1.如果你有一个ListView,listView的 adapter 是自定义的,并且item中包含一个CheckBox 跟其他的一些组件,
如果你想通过额外一的一个CheckBox来实现select All 跟dis select all 以及 手动 选择的话,可参照下面的实现方式。
merge_list_item.xml
MergeListActivity.java
MergeListAdapter.java
实现效果:
全选
[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]
如果你想通过额外一的一个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]