Оптимизация AutoCompleteTextView для контактов Android

Я реализовал функцию автозаполнения, чтобы позволить пользователю начать вводить контакт и чтобы этот контакт отображался в раскрывающемся списке с помощью 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?


person Demonofloom    schedule 10.02.2011    source источник
comment
Я делаю что-то подобное ЗДЕСЬ !!! stackoverflow.com/questions/12854336/   -  person toobsco42    schedule 30.10.2012


Ответы (1)


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

person aj.esler    schedule 31.03.2011