Как фильтровать результаты AutoCompleteTextView?

У меня есть параметр AutoCompleteTextView для использования курсора, который просматривает мои контакты. Проблема в том, что я правильно заполняю раскрывающееся меню, но не фильтрует результаты после ввода.

Вот мой код для курсора и настройки адаптера:

edt_Contact = (AutoCompleteTextView)findViewById(R.id.compose_edtContact); cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] {Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER}, null,null,null); startManagingCursor(cursor); String[] from = new String[] { Phone.DISPLAY_NAME, Phone.NUMBER}; int[] to = new int[] { R.id.contact_name, R.id.contact_phoneNo}; adapter = new SimpleCursorAdapter(this, R.layout.simple_contact_textview, cursor, from, to); edt_Contact.setAdapter(adapter); 

И вот xml для simple_contact_textview:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="5sp" android:paddingBottom="5sp" android:background="#FFFFFFFF"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/contact_name" android:textColor="#FF000000" android:textSize="20sp" android:text="Name"> </TextView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/contact_phoneNo" android:paddingLeft="10sp" android:textColor="#FF000000" android:textSize="20sp" android:text="Number" android:ellipsize="end"> </TextView> </LinearLayout> 

Как фильтровать выпадающие результаты на основе того, что пользователь вводит? Например, если пользователь начинает набирать «и», как бы у меня появлялись «andrew», «andy» и «mandy»?

Solutions Collecting From Web of "Как фильтровать результаты AutoCompleteTextView?"

FilterQueryProvider и передайте его в adapter.setFilterQueryProvider() .

 adapter.setFilterQueryProvider(new FilterQueryProvider() { public Cursor runQuery(CharSequence constraint) { String s = '%' + constraint.toString() + '%'; return getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] {Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER}, Phone.DISPLAY_NAME + ' LIKE ? OR ' + Phone.NUMBER + ' LIKE ?', new String[] { s, s }, null); } }); 

Приведенный выше код вернет результаты, которые соответствуют нишу в строке (не только в начале). Кроме того, поскольку он использует параметризованные запросы, ваши пользователи не смогут повредить БД с помощью атаки SQL-инъекции.

(Не рядом с реальным компьютером, поэтому я не могу проверить выше – возможно, некоторые синтаксические ошибки там).

Наконец, попробовал что-то работающее:

 private void initViews() { edt_Contact = (AutoCompleteTextView)findViewById(R.id.compose_edtContact); cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] {Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER}, null,null,null); startManagingCursor(cursor); String[] from = new String[] { Phone.DISPLAY_NAME, Phone.NUMBER}; int[] to = new int[] { R.id.contact_name, R.id.contact_phoneNo}; adapter = new SimpleCursorAdapter(this, R.layout.simple_contact_textview, cursor, from, to); adapter.setFilterQueryProvider(new FilterQueryProvider() { public Cursor runQuery(CharSequence constraint) { return getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[] {Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER}, Phone.DISPLAY_NAME + " LIKE '" + constraint + "%'", null, null); } }); edt_Contact.setAdapter(adapter); } 

Извините, если я лишил кого-либо ответа. Все вопросы вроде этого, кажется, имеют очень низкие взгляды и ответы …