#android #contacts
#Android #Контакты
Вопрос:
Что не так с моим предложением автозаполнения контактов для завершения процесса загрузки требуется 3-4 секунды. У меня в телефоне около 200 контактов. Действие предназначено для создания сообщения, в котором пользователь вводит / ищет контакты и пишет сообщение для отправки получателю.
Внутри моего метода oncreate:
mPeopleList = new ArrayList<Map<String, String>>();
SimpleAdapter mAdapter = new SimpleAdapter(this, mPeopleList, R.layout.custcoview,new String[] { "Name", "Phone", "Type" }, new int[] {R.id.ccontName, R.id.ccontNo, R.id.ccontType });
textView.setThreshold(1);
textView.setAdapter(mAdapter);
PopulatePeopleList();
способ загрузки контактов:
public void PopulatePeopleList(){
int i =0;
Cursor people = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (people.moveToNext()){
String contactName = people.getString(people.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
String contactId = people.getString(people.getColumnIndex(ContactsContract.Contacts._ID));
String hasPhone = people.getString(people.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if ((Integer.parseInt(hasPhone) > 0)){
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID " = " contactId,
null, null);
while (phones.moveToNext()){
String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String numberType = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
Map<String, String> NamePhoneType = new HashMap<String, String>();
NamePhoneType.put("Name", contactName);
NamePhoneType.put("Phone", phoneNumber);
if(numberType.equals("0"))
NamePhoneType.put("Type", "Work");
else
if(numberType.equals("1"))
NamePhoneType.put("Type", "Home");
else if(numberType.equals("2"))
NamePhoneType.put("Type", "Mobile");
else
NamePhoneType.put("Type", "Other");
mPeopleList.add(NamePhoneType); //add this map to the list.
}
phones.close();
}else continue;
}
people.close();
}
Редактировать
Спасибо за Матиаша. Теперь это мой рабочий метод, и он очень быстрый по сравнению с описанным выше..
public void readContacts(){
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
int colDisplayName = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
int colPhoneNumber = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
int colPhoneType = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
while (phones.moveToNext()) {
String contactName = phones.getString(colDisplayName);
String phoneNumber = phones.getString(colPhoneNumber);
String numberType = phones.getString(colPhoneType);
Map<String, String> NamePhoneType = new HashMap<String, String>();
NamePhoneType.put("Name", contactName);
NamePhoneType.put("Phone", phoneNumber);
if(numberType.equals("0"))
NamePhoneType.put("Type", "Work");
else
if(numberType.equals("1"))
NamePhoneType.put("Type", "Home");
else if(numberType.equals("2"))
NamePhoneType.put("Type", "Mobile");
else
NamePhoneType.put("Type", "Other");
mPeopleList.add(NamePhoneType); //add this map to the list.
}phones.close();
}
Комментарии:
1. Виджет работает медленно, когда пользователь вводит письмо, и должны появиться результаты? Разместите адаптер, который у вас есть.
2. Я отредактировал выше для своего рабочего кода… Теперь проблема решена.. Спасибо!
3. спасибо за обновление, человек!! спасите мой день
Ответ №1:
Вы выполняете вложенный цикл, что означает n запросов (столько, сколько у вас контактов).
Поскольку, по-видимому, вас интересуют номера телефонов всех контактов, я бы предложил выполнить итерацию только для ContactsContract.CommonDataKinds.Phone.CONTENT_URI
поставщика контента (без фильтра для идентификатора контакта). Поля, из которых вы читаете Contacts
, также присутствуют в этом провайдере.
Например:
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
colDisplayName = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
int colPhoneNumber = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
int colPhoneType = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
while (phones.moveToNext()) {
String contactName = phones.getString(colDisplayName);
String phoneNumber = phones.getString(colPhoneNumber);
String numberType = phones.getString(colPhoneType);
...
Это должно иметь гораздо лучшую производительность.