Как удалить дублированный контакт из списка контактов в android
пожалуйста, посмотрите: -
public static ArrayList<ContactsEntityBean> getContactDetails(
Context mContext) {
ArrayList<ContactsEntityBean> contactList = new ArrayList<ContactsEntityBean>();
ContentResolver cr = mContext.getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String id = cur.getString(cur
.getColumnIndex(ContactsContract.Contacts._ID));
Cursor cur1 = cr.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null, ContactsContract.CommonDataKinds.Email.CONTACT_ID
+ " = ?", new String[] {
id
}, null);
while (cur1.moveToNext()) {
ContactsEntityBean contactsEntityBean = new ContactsEntityBean();
// to get the contact names
String name = cur1
.getString(cur1
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
// Log.e("Name :", name);
String email = cur1
.getString(cur1
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
// Log.e("Email", email);
contactsEntityBean.setName(name);
contactsEntityBean.setEmail(email);
if (email != null) {
contactList.add(contactsEntityBean);
}
}
cur1.close();
}
}
return contactList;
}
этот метод возвращает несколько контактов от одного и того же пользователя, если я сохранил abc @gmail.com, abc @gmail.com для того же пользователя, чтобы он возвращал [email protected]& [email protected]
но я хочу только одну запись [email protected]
public static ArrayList<SearchEntityBean> getContactEmailDetails(
Context mContext) {
ArrayList<SearchEntityBean> contactList = new ArrayList<SearchEntityBean>();
try {
ContentResolver cr = mContext.getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String email = "";
String id = cur.getString(cur
.getColumnIndex(ContactsContract.Contacts._ID));
Cursor cur1 = cr.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID
+ " = ?", new String[] {
id
}, null);
SearchEntityBean contactsEntityBean = new SearchEntityBean();
while (cur1.moveToNext()) {
// to get the contact names
String name = cur1
.getString(cur1
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String image = cur1
.getString(cur1
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_ID));
String mail = cur1
.getString(cur1
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
if (mail != null) {
if (!mail.equalsIgnoreCase(LoginPreferenceClass
.getEmailID(mContext)))
email = email + mail + ",";
}
// Log.e("rohit", "Contact Email :" + email);
contactsEntityBean.setName(name);
contactsEntityBean.setImage(image);
}
if (email != null) {
if (email.length() > 0) {
if (email.split(",").length > 1) {
contactsEntityBean.setMutipleEmail(true);
}
contactsEntityBean.setUserType("2");
contactsEntityBean.setContactId(id);
contactsEntityBean.setEmail(email);
contactList.add(contactsEntityBean);
}
}
cur1.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
HashSet<SearchEntityBean> hs = new HashSet<SearchEntityBean>();
hs.addAll(contactList);
contactList.clear();
contactList.addAll(hs);
return contactList;
}
Ответы
Ответ 1
Вы должны изменить свой ContactsEntityBean
, как показано ниже
public class ContactsEntityBean {
private HashSet<String> emails = new HashSet<String>();
public void setEmail(String email) {
if (email == null)
return;
this.emails.add(email.trim());
}
public HashSet<String> getEmails() {
return this.emails;
}
}
Будут рассмотрены дубликаты писем... вы можете использовать такую же логику для адресов, телефонов и т.д.
Замените ContactsEntityBean
на
public class ContactsEntityBean {
private HashSet<String> emails;
private HashSet<String> phones;
private HashSet<String> addresses;
private String contactId;
private boolean checked = false;
public ContactsEntityBean() {
this.emails = new HashSet<String>();
this.phones = new HashSet<String>();
this.addresses = new HashSet<String>();
}
public HashSet<String> getPhones() {
return phones;
}
public void setPhones(String phone) {
if (phone == null)
return;
this.phones.add(phone.trim());
}
public HashSet<String> getAddresses() {
return addresses;
}
public void setAddresses(String address) {
if (address == null)
return;
this.addresses.add(address.trim());
}
public void setEmails(String email) {
if (email == null)
return;
this.emails.add(email.trim());
}
public HashSet<String> getEmails() {
return emails;
}
public String getContactId() {
return contactId;
}
public void setContactId(String contactId) {
this.contactId = contactId;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
}
И не нужно заботиться о дубликатах. это позаботится обо всех вещах.
Ответ 2
Работает от меня
private void getContactDetails(ContentResolver contentResolver) {
Cursor phones = contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
null, null);
HashSet<String> mobileNoSet = new HashSet<String>();
while (phones.moveToNext()) {
String name = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String email = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
String imagUri = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Photo.PHOTO_URI));
long id = phones.getColumnIndex(ContactsContract.Contacts._ID);
if (!mobileNoSet.contains(phoneNumber)) {
arrayContacts.add(new Contact(name, phoneNumber, email,
imagUri, id));
mobileNoSet.add(phoneNumber);
}
}
adapterContact = new AdapterContact(getActivity(), arrayContacts);
listContact.setAdapter(adapterContact);
}
Ответ 3
Изменяя свой метод таким образом, вы можете получить единственный контакт, который не дублируется.
public static ArrayList<ContactsEntityBean> getContactDetails(Context mContext) {
ArrayList<ContactsEntityBean> contactList = new ArrayList<ContactsEntityBean>();
ContentResolver cr = mContext.getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, null);
HashMap<String, String> data = new HashMap<String, String>();
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String id = cur.getString(cur
.getColumnIndex(ContactsContract.Contacts._ID));
Cursor cur1 = cr.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null, ContactsContract.CommonDataKinds.Email.CONTACT_ID
+ " = ?", new String[] { id }, null);
while (cur1.moveToNext()) {
ContactsEntityBean contactsEntityBean = new ContactsEntityBean();
// to get the contact names
String name = cur1
.getString(cur1
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
// Log.e("Name :", name);
String email = cur1
.getString(cur1
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
if (!data.containsValue(email)) {
// Log.e("Email", email);
contactsEntityBean.setName(name);
contactsEntityBean.setEmail(email);
data.put(name, email);
if (email != null) {
contactList.add(contactsEntityBean);
}
}
}
cur1.close();
}
}
return contactList;
}
Ответ 4
Сохраните контакты в ArrayList, а затем удалите дубликаты из списка.
Самый простой способ удалить повторяющиеся элементы - это добавить содержимое в Set (который не позволит дублировать), а затем добавить Set обратно в ArrayList.
Используйте HashSet
следующим образом.
ArrayList al = new ArrayList();
// add elements to al, including duplicates
HashSet hs = new HashSet();
hs.addAll(al);
al.clear();
al.addAll(hs);
Ответ 5
Используйте HashMap, потому что HashMap не позволяет дублировать ключи
Объявить глобальную переменную
// Hash Maps
Map<String, String> nameEmailMap = new HashMap<String, String>();
В вашем цикле Добавить данные в HashMap
// Enter Into Hash Map
nameEmailMap.put(email, name);
Вне циклы Получить журнал
// Get The Contents of Hash Map in Log
for (Map.Entry<String, String> entry : namePhoneMap.entrySet()) {
String key = entry.getKey();
Log.d(TAG, "Phone :" + key);
String value = entry.getValue();
Log.d(TAG, "Name :" + value);
}
Для получения полного ответа о том, как получить контакты без дубликатов, см. fooobar.com/questions/116742/... (для электронных писем) и fooobar.com/questions/97422/... (для телефонов).
Ответ 6
Как только контактное письмо добавлено в ваш ArrayList, поместите continue
после этого и используйте HashSet
вместо ArrayList
if (email != null) {
contactList.add(contactsEntityBean);
continue;
}