标签:
首先给出实现完的界面图
上面是给出来的实现结果图。
从本地联系人中导出联系人,需要使用ContentProvider来获取通讯录中的联系人。
从通讯录中获取联系人方法如下:
/** 得到手机通讯录联系人信息 **/
private void getPhoneContacts() {
ContentResolver resolver = ContactsActivity.this.getContentResolver();
// 获取手机联系人
Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI,
null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
// 查看联系人有多少个号码,如果没有号码,返回0
int idColumn = cursor
.getColumnIndex(ContactsContract.Contacts._ID);
int phoneCount = cursor
.getInt(cursor
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
int displayNameColumn = cursor
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
// 得到联系人名称
String contactName = cursor.getString(displayNameColumn);
// 获得联系人的ID
String contactId = cursor.getString(idColumn);
List<String> list = new ArrayList<String>();
if (phoneCount > 0) {
// 获得联系人的电话号码列表
Cursor phoneCursor = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ "=" + contactId, null, null);
if (phoneCursor.moveToFirst()) {
do {
// 遍历所有的联系人下面所有的电话号码
String phoneNumber = phoneCursor
.getString(phoneCursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
// 去掉手机号中的空格和“-”
phoneNumber = phoneNumber.replace(" ", "")
.replace("-", "").replace("+86", "");
if (DataTools.isMobileNO(phoneNumber)) {
if (!list.contains(phoneNumber)) {
list.add(phoneNumber);
}
}
} while (phoneCursor.moveToNext());
}
phoneCursor.close();
}
// //得到手机号码
// String phoneNumber = cursor.getString(PHONES_NUMBER_INDEX);
// 当手机号码为空的或者为空字段 跳过当前循环
if (list.size() > 0) {
if (!maps.containsKey(contactId)) {// 所有联系人放到maps中,
ContactBean bean = new ContactBean();
bean.setContactName(contactName);
bean.setContactNum(list);
bean.setCheck(false);
maps.put(contactId, bean);
}
}
}
cursor.close();
}
if (maps.size() > 0) {// 有数据
handler.sendEmptyMessage(1);
} else {
handler.sendEmptyMessage(0);
}
}实体ContactBean类
public class ContactBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String contactName;
private List<String> contactNum;
private boolean isCheck;
private int positon = -1;
private String addr;
public String getContactName() {
return contactName;
}
public void setContactName(String contactName) {
this.contactName = contactName;
}
public List<String> getContactNum() {
return contactNum;
}
public void setContactNum(List<String> contactNum) {
this.contactNum = contactNum;
}
public boolean isCheck() {
return isCheck;
}
public void setCheck(boolean isCheck) {
this.isCheck = isCheck;
}
public int getPositon() {
return positon;
}
public void setPositon(int positon) {
this.positon = positon;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
处理数据分类的方法代码如下:
public void dataClassify {
for (Map.Entry<String, ContactBean> entry : maps.entrySet()) {// 遍历全部数据
if (entry.getValue().getContactNum().size() > 1) {
nameMaps.put(entry.getKey(), entry.getValue());// 将姓名号码一对多的放入nameMaps中
} else {
for (Map.Entry<String, ContactBean> entry1 : maps.entrySet()) {
if (!entry.getValue().getContactName()
.equals(entry1.getValue().getContactName())
&& entry.getValue()
.getContactNum()
.get(0)
.equals(entry1.getValue().getContactNum()
.get(0))) {
// 将号码与姓名一对多的放入phoneMaps中
phoneMaps.put(entry.getKey(), entry.getValue());
phoneMaps.put(entry1.getKey(), entry1.getValue());
}
}
}
}
for (Map.Entry<String, ContactBean> entry : nameMaps.entrySet()) {// 踢掉姓名号码一对多对象
maps.remove(entry.getKey());
nameList.add(entry.getValue());
}
for (Map.Entry<String, ContactBean> entry : phoneMaps.entrySet()) {// 踢掉号码姓名一对多对象
maps.remove(entry.getKey());
set.add(entry.getValue().getContactNum().get(0));
}
for (String str : set) {
List<String> list = new ArrayList<String>();
for (Map.Entry<String, ContactBean> entry : phoneMaps.entrySet()) {
if (str.equals(entry.getValue().getContactNum().get(0))) {
list.add(entry.getValue().getContactName());
}
}
ContactBean contactBean = new ContactBean();
contactBean.setContactName(str);
contactBean.setContactNum(list);
phoneList.add(contactBean);
}
for (Map.Entry<String, ContactBean> entry : maps.entrySet()) {// 放到数据集中进行适配
dataList.add(entry.getValue());
}
// List<ContactBean> duList = new ArrayList<ContactBean>();
for (int i = 0; i < dataList.size() - 1; i++) {// 去掉同名同电话数据
for (int j = dataList.size() - 1; j > i; j--) {
if (dataList.get(j).getContactName()
.equals(dataList.get(i).getContactName())
&& dataList.get(j).getContactNum().get(0)
.equals(dataList.get(i).getContactNum().get(0))) {
dataList.remove(j);
}
}
}
adapter.notifyDataSetChanged();
}
一对一联系人的列表适配类ContactListAdapter
public class ContactListAdapter extends BaseAdapter {
private Context mContext;
private List<ContactBean> dataList;
private TextView numTextView;
public ContactListAdapter(Context context, List<ContactBean> list,TextView numTextView) {
this.mContext = context;
this.dataList = list;
this.numTextView = numTextView;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return dataList != null ? dataList.size() : 0;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
final ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(
R.layout.item_contact_import_listview, null);
viewHolder.nameTextView = (TextView) convertView
.findViewById(R.id.contact_import_name_txt);
viewHolder.numTextView = (TextView) convertView
.findViewById(R.id.contact_import_num_txt);
viewHolder.checkBox = (CheckBox) convertView
.findViewById(R.id.contact_import_checkbox);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.nameTextView
.setText(dataList.get(position).getContactName());
viewHolder.numTextView.setText(dataList.get(position).getContactNum()
.get(0));
viewHolder.checkBox.setOnCheckedChangeListener(null);
if (dataList.get(position).isCheck()) {
viewHolder.checkBox.setChecked(true);
viewHolder.checkBox
.setButtonDrawable(R.drawable.xuankuangxuanzhong);
} else {
viewHolder.checkBox.setChecked(false);
viewHolder.checkBox.setButtonDrawable(R.drawable.xuankuangfang);
}
viewHolder.checkBox
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked) {// 选中
viewHolder.checkBox.setChecked(true);
viewHolder.checkBox
.setButtonDrawable(R.drawable.xuankuangxuanzhong);
dataList.get(pos).setCheck(true);
int i = getSelectItem().size();
numTextView.setText("已选择"+i+"位联系人");
} else {
viewHolder.checkBox.setChecked(false);
dataList.get(pos).setCheck(false);
viewHolder.checkBox
.setButtonDrawable(R.drawable.xuankuangfang);
int i = getSelectItem().size();
numTextView.setText("已选择"+i+"位联系人");
}
}
});
return convertView;
}
public List<ContactBean> getSelectItem(){
List<ContactBean> list = new ArrayList<ContactBean>();
for (int i = 0; i < dataList.size(); i++) {
if(dataList.get(i).isCheck()){
list.add(dataList.get(i));
}
}
return list;
}
@Override
public void notifyDataSetChanged() {
// TODO Auto-generated method stub
super.notifyDataSetChanged();
numTextView.setText("已选择"+getSelectItem().size()+"位联系人");
}
public void selectAll(){
for (int i = 0; i < dataList.size(); i++) {
dataList.get(i).setCheck(true);
}
notifyDataSetChanged();
}
public void cancelAll(){
for (int i = 0; i < dataList.size(); i++) {
dataList.get(i).setCheck(false);
}
notifyDataSetChanged();
}
public static class ViewHolder {
private TextView nameTextView;
private TextView numTextView;
private CheckBox checkBox;
}
}public class ContactSameNameListAdapter extends BaseAdapter {
private Context mContext;
private List<ContactBean> dataList;
private TextView numTextView;
private int type;//1为name2为phone
private List<HashSet<String>> selectSet = new ArrayList<HashSet<String>>();
public ContactSameNameListAdapter(Context context, List<ContactBean> list,
TextView numTextView,int type) {
this.mContext = context;
this.dataList = list;
this.numTextView = numTextView;
this.type = type;
for (int i = 0;dataList!=null&&i < dataList.size(); i++) {
HashSet<String> set = new HashSet<String>();
selectSet.add(set);
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return dataList != null ? dataList.size() : 0;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(
R.layout.item_contact_same_name_listview, null);
viewHolder.nameTextView = (TextView) convertView
.findViewById(R.id.contact_import_same_txt);
viewHolder.listview = (ListView) convertView
.findViewById(R.id.contact_import_same_listview);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
ContactsSameItemListAdapter adapter = new ContactsSameItemListAdapter(
mContext, dataList.get(position),dataList,position,numTextView,selectSet.get(position));
viewHolder.listview.setAdapter(adapter);
viewHolder.listview.setDividerHeight(0);
viewHolder.nameTextView
.setText(dataList.get(position).getContactName());
setGridViewHeightBasedOnChildren(viewHolder.listview);
return convertView;
}
public List<ContactBean> getSelectItem(){
List<ContactBean> alist = new ArrayList<ContactBean>();
for (int i = 0; i < dataList.size(); i++) {
if(dataList.get(i).getPositon()>=0){
ContactBean contactBean = new ContactBean();
contactBean.setCheck(true);
if(type==1){
contactBean.setContactName(dataList.get(i).getContactName());
List<String> strlist = new ArrayList<String>();
strlist.add(dataList.get(i).getContactNum().get(dataList.get(i).getPositon()));
contactBean.setContactNum(strlist);
}else{
contactBean.setContactName(dataList.get(i).getContactNum().get(dataList.get(i).getPositon()));
List<String> strlist = new ArrayList<String>();
strlist.add(dataList.get(i).getContactName());
contactBean.setContactNum(strlist);
}
alist.add(contactBean);
}
}
return alist;
}
@Override
public void notifyDataSetChanged() {
// TODO Auto-generated method stub
super.notifyDataSetChanged();
numTextView.setText("已选择" + getSelectItem().size() + "位联系人");
}
public void selectAll() {
for (int i = 0; i < dataList.size(); i++) {
dataList.get(i).setCheck(true);
}
notifyDataSetChanged();
}
public void cancelAll() {
for (int i = 0; i < dataList.size(); i++) {
dataList.get(i).setCheck(false);
}
notifyDataSetChanged();
}
public static class ViewHolder {
private TextView nameTextView;
private ListView listview;
}
public void setGridViewHeightBasedOnChildren(ListView listView) {
// 获取GridView对应的Adapter
if (listView == null) {
return;
}
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}
public class ContactsSameItemListAdapter extends BaseAdapter {
private Context mContext;
private ContactBean dataList;
private HashSet<String> selectSect;
private List<ContactBean> list;
private int seposi;
private TextView numTextView;
public ContactsSameItemListAdapter(Context context, ContactBean list,
List<ContactBean> mlist, int seposi, TextView textView,
HashSet<String> selectSet) {
this.mContext = context;
this.dataList = list;
this.list = mlist;
this.seposi = seposi;
this.numTextView = textView;
this.selectSect = selectSet;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return dataList != null ? dataList.getContactNum().size() : 0;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
final ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(
R.layout.item_contact_same_name_import_listview, null);
viewHolder.nameTextView = (TextView) convertView
.findViewById(R.id.contact_import_same_name_txt);
viewHolder.checkBox = (CheckBox) convertView
.findViewById(R.id.contact_import_same_name_checkbox);
viewHolder.lineView = convertView.findViewById(R.id.view_line001);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if (position == dataList.getContactNum().size() - 1) {
viewHolder.lineView.setVisibility(View.GONE);
} else {
viewHolder.lineView.setVisibility(View.VISIBLE);
}
viewHolder.nameTextView.setText(dataList.getContactNum().get(position));
viewHolder.checkBox.setOnCheckedChangeListener(null);
if (selectSect.contains(dataList.getContactNum().get(position))) {
viewHolder.checkBox.setChecked(true);
viewHolder.checkBox.setButtonDrawable(R.drawable.xuanzhong);
} else {
viewHolder.checkBox.setChecked(false);
viewHolder.checkBox.setButtonDrawable(R.drawable.xuankuang);
}
viewHolder.checkBox
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
String regEx = "[^0-9]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(numTextView.getText().toString());
int num = Integer.parseInt(m.replaceAll("").trim());
if (isChecked) {// 选中
viewHolder.checkBox.setChecked(true);
list.get(seposi).setPositon(pos);
if (selectSect.size() == 0) {
numTextView.setText("已选择" + (num + 1) + "位联系人");
}
selectSect.clear();
selectSect.add(dataList.getContactNum().get(pos));
notifyDataSetChanged();
} else {
list.get(seposi).setPositon(-1);
selectSect
.remove(dataList.getContactNum().get(pos));
viewHolder.checkBox.setChecked(false);
notifyDataSetChanged();
numTextView.setText("已选择" + (num - 1) + "位联系人");
}
}
});
return convertView;
}
public static class ViewHolder {
private TextView nameTextView;
private CheckBox checkBox;
private View lineView;
}
}
<?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"
android:background="@color/bg_gray_login"
android:orientation="vertical" >
<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#A0A0A0"
android:layout_marginTop="5dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="horizontal"
android:weightSum="3" >
<TextView
android:id="@+id/contact_import_same_txt"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_weight="1"
android:gravity="center"
android:singleLine="true"
android:text="aa"
android:textColor="@color/black" />
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="#A0A0A0" />
<ListView
android:id="@+id/contact_import_same_listview"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:scrollbars="none" >
</ListView>
</LinearLayout>
<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#A0A0A0"/>
</LinearLayout>标签:
原文地址:http://blog.csdn.net/zhuod/article/details/51210209