Android通讯录开发之实现全选、反选功能
2014年1月15日
实现全选、反选不是什么难的事情,就只是用另外一个数据结构来存储被选中的状态,通过刷新列表来更新列表的显示状态。下面是实现效果:
定义一个散列表来存储选中状态
// 用于保存勾选的联系人 private HashMap<Contact, Boolean> map_NumberSelected = new HashMap<Contact, Boolean>();
定义标识表示是否已经全选
private boolean isAllChecked = false;
在触发事件的位置根据标识来实现全选或反选
if (isAllChecked) { selectAllBtn.setBackgroundResource(R.drawable.select_all_not); invertSelection(); } else { selectAllBtn.setBackgroundResource(R.drawable.select_all); selectAllContacts(); }
public void selectAllContacts() { for (int i = 0; i < contactList.size(); i++) { Contact contact = contactList.get(i); map_NumberSelected.put(contact, true); } isAllChecked = true; refreshList(); }
反选方法
public void invertSelection() { for (int i = 0; i < contactList.size(); i++) { Contact contact = contactList.get(i); map_NumberSelected.put(contact, false); } isAllChecked = false; refreshList(); }
上面用到contactList是你得到的数据源,是一个List<Contact>,它跟map_NumberSelected都通过adapter里面定义的set方法注入到adapter里,所以选中状态发生变化也相当于数据源发生变化,只要调用notifyDataSetChanged()方法就可以更新列表。
下面是自定义adapter的代码,更新选中的状态在getView方法进行
package com.suntek.mobilemeeting.adapter; import java.util.ArrayList; import java.util.HashMap; import android.content.Context; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.TextView; import com.suntek.mobilemeeting.R; import com.suntek.mobilemeeting.model.Contact; /** * 本地联系人适配器 * * @author wwj * */ public class LocalContactAdapter extends BaseAdapter { private HashMap<Integer, View> lmap = new HashMap<Integer, View>(); private ArrayList<Contact> contactList; private Context context; private HashMap<Contact, Boolean> map_NumberSelected = null; private String kind; public class ViewHolder { public TextView contactName; public TextView contactMobile; public TextView contactEmail; public CheckBox checkBox; } public LocalContactAdapter(Context context, ArrayList<Contact> contactList, String kind) { this.contactList = contactList; this.context = context; map_NumberSelected = new HashMap<Contact, Boolean>(); this.kind = kind; } @Override public int getCount() { return contactList.size(); } @Override public Object getItem(int position) { return contactList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.local_contact_list_item, null); holder.contactName = (TextView) convertView .findViewById(R.id.name_tv); holder.contactMobile = (TextView) convertView .findViewById(R.id.number_tv); holder.contactEmail = (TextView) convertView .findViewById(R.id.email_tv); holder.checkBox = (CheckBox) convertView .findViewById(R.id.local_contact_checkbox); // lmap.put(position, convertView); convertView.setTag(holder); } else { // convertView = lmap.get(position); holder = (ViewHolder) convertView.getTag(); } Contact contact = contactList.get(position); if (contact.getName() == "" || contact.getName() == null) { String name = "未知"; holder.contactName.setText(name); } else { holder.contactName.setText(contact.getName()); } if (kind != null && kind.equals("email")) { if (!TextUtils.isEmpty(contact.getEmail())) { holder.contactEmail.setText(contact.getEmail()); holder.contactMobile.setVisibility(View.GONE); } } else if (!TextUtils.isEmpty(contact.getNumber())) { holder.contactMobile.setText(contact.getNumber()); holder.contactEmail.setVisibility(View.GONE); } else { holder.contactMobile.setVisibility(View.GONE); holder.contactEmail.setVisibility(View.GONE); } // 显示是否选中状态 holder.checkBox.setChecked(map_NumberSelected.get(contact)); return convertView; } public void setContactList(ArrayList<Contact> contactList) { this.contactList = contactList; } public void setMap_NumberSelected( HashMap<Contact, Boolean> map_NumberSelected) { this.map_NumberSelected = map_NumberSelected; } }