Оптимизация AutoCompleteTextView для контактов Android - PullRequest
0 голосов
/ 10 февраля 2011

Я реализовал функцию автозаполнения, чтобы позволить пользователю начать вводить контакт и чтобы этот контакт отображался в раскрывающемся списке с помощью autoCompleteTextView, так же, как он работает при выборе контактов для сообщений или сообщений электронной почты.

Поскольку я не хочу, чтобы переменная содержала все контакты сразу, поскольку она может быть очень большой, я заполнил свой ArrayList, когда пользователь вводит буквы в поле контакта.

Янастроить его так: - peopleList = new ArrayList> ();

        adapter = new SimpleAdapter(this, peopleList, R.layout.customcontcell ,new String[] { "Name", "Phone" , "Type" }, new int[] { R.id.ccontName, R.id.ccontNo, R.id.ccontType });
        txtPhoneNo.setAdapter(adapter);

Затем, когда пользователь начинает вводить имя, он берет все строки из контактов, которые соответствуют этому, это делается в моей функции«QueryContacts» выглядит так: -

selectionWhere = ContactsContract.Contacts.DISPLAY_NAME+" LIKE '" + name + "%'";


                //Cursor to retrive contact details.
                Cursor people = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, selectionWhere, null, null);

Этот курсор затем используется для заполнения моего peopleList, который используется адаптером.

В этом состоянии он работает, однако без некоторых проверокПриведенный выше код в конечном итоге извлекает ВСЕ контакты (так как имя не вводится, поэтому он ничего не фильтрует) и выполняется каждый раз, когда набирается новая буква.Это нервный и медленный процесс.

Поэтому я хотел поставить несколько простых проверок, чтобы ограничить его извлечением контактов только после ввода 2 букв, и не получать больше, если оно не идет ниже 2 букв, а затем снова возвращается к 2.

Итак, к моим функциям QueryContacts я добавляю: -

if(name.length() < 2)
                mGotContacts = false;
            //If the length is two letters long and we haven't queried already, query for the name.
            if(name.length() == 2 && mGotContacts == false)
            {

// Cursor code
// Populate list with cursor data.
}

Теперь проблема в том, что autocompleteTextView больше не падает, я проверил, и переменная peopleLists, которая заполнила мой SimpleAdapter, корректно обновляется,

Итак, я делаю это глупо?Должен ли я просто собрать все данные за один раз и позволить фильтру AutoCompleteTextView их отфильтровать?

Это лучший способ сделать это, и почему он больше не работает с этими проверками в моей функции QueryContacts?

1 Ответ

1 голос
/ 31 марта 2011

Посмотрите на пороговое свойство AutoCompleteTextView. Порог определяет количество символов, которое необходимо ввести перед отображением выпадающего списка автозаполнения. Я не уверен, какое влияние это окажет на производительность, но, поскольку он является родным для Android, я представляю его максимально быстрым. документация метода setThreshold

...