1、实体类
package com.app.bean;
import com.app.dao.PinyinTool;
/**
public class ContactsBean {
private int contactId;
private int icon;
private String contactsName;
private String company;
private String phoneNumber;
private String remark;
private String job;
private String email;
private Boolean selectedContact=false;
public Boolean getSelectedContact() {
return selectedContact;
}
public void setSelectedContact(Boolean selectedContact) {
this.selectedContact = selectedContact;
}
public String getSort_key_primary() {
return sort_key_primary;
}
public void setSort_key_primary(String sort_key_primary) {
this.sort_key_primary = sort_key_primary;
}
private String sort_key_primary;
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getContactId() {
return contactId;
}
public void setContactId(int contactId) {
this.contactId = contactId;
}
public int getIcon() {
return icon;
}
public void setIcon(int icon) {
this.icon = icon;
}
public String getContactsName() {
return contactsName;
}
public void setContactsName(String contactsName) {
this.contactsName = contactsName;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
//获取名字拼音首字母
public String getFirstLetterOfName(){
String key="";
if (sort_key_primary!=null){
key= PinyinTool.getFirstSpell(sort_key_primary);
}
return key;
}
}
2、主程序
package com.app.com.kag.activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import com.addresslist.R;
import com.app.FragmentAdapter.AddContactFromAddressAdapter;
import com.app.bean.ContactsBean;
import com.app.dao.ContactsDao;
import java.util.ArrayList;
import java.util.List;
public class AddContactFromAddressList extends AppCompatActivity {
private ContactsBean contactsBean;
private ListView lv;
private ArrayList contacts;
private ContactsDao dao;
private Button mAddContacts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_contact_from_address_list);
init();
}
private void init(){
lv = findViewById(R.id.lv_contacts_list);
mAddContacts=findViewById(R.id.btn_add_contacts);
//获取通讯录数据并布局到adapter
contacts = new ArrayList();
reaContacts(contacts);
final AddContactFromAddressAdapter adapter = new AddContactFromAddressAdapter(this, contacts);
lv.setAdapter(adapter);
//
//添加按钮的点击事件
mAddContacts.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
//从手机通讯录中读取数据
public List reaContacts(ArrayList contacts) {
Uri uri = Uri.parse("content://com.android.contacts/contacts");
ContentResolver resolver = this.getContentResolver();
Cursor cursor = resolver.query(uri, null, null, null, ContactsContract.Contacts.SORT_KEY_PRIMARY);
while (cursor.moveToNext()) {
//
int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
// String phone =cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));//这行报错:Make sure the Cursor is initialized correctly before accessing data from it
String sort_key = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.SORT_KEY_PRIMARY));
contactsBean = null;
contactsBean = new ContactsBean();//此对象的创建必须在while循环内,不然只得到一条数据。
contactsBean.setContactsName(name);
contactsBean.setContactId(id);
contactsBean.setSort_key_primary(sort_key);
Cursor phone = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null);
ArrayList phoneNumber = new ArrayList();
while (phone.moveToNext()) {
String number = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
phoneNumber.add(number);
contactsBean.setPhoneNumber(String.valueOf(phoneNumber));
}
contacts.add(contactsBean);
// System.out.println(contactsBean.getContactsName() + ":" + contactsBean.getPhoneNumber()+sort_key);
}
return contacts;
}
}
3、adapter
package com.app.FragmentAdapter;
import android.content.Context;
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.addresslist.R;
import com.app.bean.ContactsBean;
;import java.util.ArrayList;
import java.util.List;
/**
public class AddContactFromAddressAdapter extends BaseAdapter {
//数据
private List contacts;
//是否选中
private ArrayList selectedList;
;
private LayoutInflater inflater;
public AddContactFromAddressAdapter(Context context, List<ContactsBean> contacts) {
this.contacts = contacts;
inflater = LayoutInflater.from(context);
selectedList=new ArrayList();
}
@Override
public int getCount() {
return contacts.size();
}
@Override
public Object getItem(int position) {
return contacts.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.contacts_cell, null);
holder = new ViewHolder();
holder.sort_key = convertView.findViewById(R.id.tv_sort_key);
holder.mPhones = convertView.findViewById(R.id.tv_phones);
holder.checkBoxSelected = convertView.findViewById(R.id.cb_selected);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//控件上添加数据
holder.sort_key.setText(contacts.get(position).getFirstLetterOfName());
holder.mPhones.setText(contacts.get(position).getContactsName() + ":"
+ contacts.get(position).getPhoneNumber());
if (contacts.get(position).getSelectedContact()) {
holder.checkBoxSelected.setChecked(true);
} else {
holder.checkBoxSelected.setChecked(false);
}
//checkbox点击事件判断
holder.checkBoxSelected.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (contacts.get(position).getSelectedContact()) {
contacts.get(position).setSelectedContact(false);
selectedList.remove(contacts.get(position));
} else {
contacts.get(position).setSelectedContact(true);
//选中的添加到集合中
selectedList.add(contacts.get(position));
}
}
});
return convertView;
}
private final class ViewHolder {
public TextView sort_key;
public TextView mPhones;
public CheckBox checkBoxSelected;
}
}
4、运行的截图
private HashMap mSelectedGrouplists;//key=列表中展示的数据,value=position;
private List mList;//解决复用
private ArrayList selecteds;//上一个界面携带过来的数据集
public GroupAdapter() {
mSelectedGrouplists = new HashMap<>();
mList = new ArrayList<>();
selecteds = new ArrayList<>();
}
public List<String> getDataSource() {
return mDataSource;
}
/**
* 回显
*
* @param list
*/
public void checkSelectedGrouplists(ArrayList<String> list) {
if (list == null) {
return;
}
selecteds = list;
for (String s : list) {
if (mDataSource.contains(s)) {
int i = mDataSource.indexOf(s);
if (!mSelectedGrouplists.containsKey(s))
mSelectedGrouplists.put(s, i);
}
}
}
//获取选中的键值对集合
public HashMap<String, Integer> getSelectedGrouplists() {
return mSelectedGrouplists;
}
@Override
public ClickableViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
bindContext(parent.getContext());
View inflate = LayoutInflater.from(context).inflate(R.layout.group_item, parent, false);
return new GroupViewHolder(inflate);
}
@Override
public void onBindViewHolder(ClickableViewHolder holder, final int position) {
super.onBindViewHolder(holder, position);
if (holder instanceof GroupViewHolder) {
final GroupViewHolder gvh = (GroupViewHolder) holder;
final String group = mDataSource.get(position);//group=="id:名称"
String[] group_split = group.split(":");
final String group_name = group_split[1];
mList.clear();
for (String key : mSelectedGrouplists.keySet()) {
if (mDataSource.contains(key)) {
int i = mDataSource.indexOf(key);
mList.add(i);
}
}
gvh.mGroupName.setText(group_name);//名称
gvh.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (!mList.contains(position)) {
mList.add(position);
}
if (!selecteds.contains(group)) {
selecteds.add(group);
}
if (!mSelectedGrouplists.keySet().contains(group)) {//名称与id拼接的字符串
mSelectedGrouplists.put(group, position);
}
} else {
if (mList.contains(position)) {
int i = mList.indexOf(position);
mList.remove(i);
}
if (selecteds.contains(group)) {
int i = selecteds.indexOf(group);
selecteds.remove(i);
}
if (mSelectedGrouplists.keySet().contains(group)) {
mSelectedGrouplists.remove(group);
}
}
itemClickListener.onItemClick(position, gvh);
}
});
//回显
if (selecteds.contains(group)) {
if (!mList.contains(position))
mList.add(position);
}
//解决复用问题
gvh.mCheckBox.setChecked(mList.contains(position) ? true : false);
}
}
稍微修改后应该可以解决你的问题。
也可以这样的吧holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub if(isChecked){ if(!chooseNum.contains(position)){ System.out.println(position); chooseNum.add(position); } }else{ chooseNum.remove(Integer.valueOf(position)); } } });public ArrayList getChooseList(){ return chooseNum; }通过adpter.getChooseList获得选中的 行的数组。
holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub if(isChecked){ if(!chooseNum.contains(position)){ System.out.println(position); chooseNum.add(position); } }else{ chooseNum.remove(Integer.valueOf(position)); } } });public ArrayList getChooseList(){ return chooseNum; }
取到选中的 联系人唯一标识 然后根据唯一标示取数据库查询
将选中的position放入集合中,List mPosition;
for(int i = 0;i < mPosition.size; i++){
ContactsBean contactsBean = contacts.get(i)
........
}