AutoCompleteTextView занимает так много времени для перезагрузки контактов

#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);
    ...
  

Это должно иметь гораздо лучшую производительность.