Я реализовал функцию автозаполнения, чтобы позволить пользователю начать вводить контакт и чтобы этот контакт отображался в раскрывающемся списке с помощью 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);
Затем этот курсор используется для заполнения моего списка людей, который используется адаптером.
В этом состоянии он работает, однако без некоторых проверок приведенный выше код сначала извлекает ВСЕ контакты (поскольку имя не введено, поэтому он ничего не фильтрует) и запускается каждый раз, когда набирается новая буква. Это нервно и медленно.
Поэтому я хотел поставить несколько простых проверок, чтобы ограничить его получением контактов только после ввода 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?