Cómo filtrar los resultados de AutoCompleteTextView?
Tengo un AutoCompleteTextView fijado para utilizar un cursor que pasa sobre mis contactos. El problema es, lo tengo poblando la lista desplegable correctamente, pero su no filtrar los resultados después de que mecanografío.
Aquí está mi código para el cursor y la configuración del adaptador:
- AutoCompleteTextView onItemClick posición del artículo o id usando HashMap
- ¿Cómo comprobar el estado dropDown (mostrado u ocultado) en autoCompleteTextView?
- AutoCompleteTextView permite sólo las opciones sugeridas
- Cómo cambiar el color de texto de autocompletar para la vista de búsqueda dentro de ActionBarSherlock con fondo oscuro?
- Android AutoCompleteTextView onItemSelectedListener no se dispara con un teclado bluetooth
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);
Y aquí está el xml para 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>
¿Cómo puedo filtrar los resultados desplegables según lo que el usuario está escribiendo? Por ejemplo, si el usuario empieza a escribir "y", ¿cómo tendría "andrew", "andy" y "mandy"?
- Cambiar el ancho de AutoCompleteTextView en Android
- Anulando filterresults en android autocompletetextview?
- Diseño personalizado de Android para AutoCompleteTextView
- Cómo agregar indicador de carga a AutoCompleteTextView
- Cómo resolver "El contenido del adaptador ha cambiado pero ListView no ha recibido una notificación" excepción
- Cómo crear personalizado BaseAdapter para AutoCompleteTextView
- Android AutoCompleteTextView blanco en blanco Lista desplegable
- Mostrando resultados de autocompletetextview como sugerencias arriba del teclado
Construir un FilterQueryProvider
y pasarlo en 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); } });
El código anterior devolverá los resultados que coincidan en cualquier parte de la cadena (no sólo en el principio), ya que utiliza consultas parametrizadas, sus usuarios no podrán dañar la base de datos a través de un ataque de inyección de SQL.
(No cerca de una computadora real, por lo que no puedo probar lo anterior – probablemente algunos errores de sintaxis allí.)
Finalmente intentó algo que funcionó:
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); }
Lo siento si le robé a alguien una respuesta. Todas las preguntas como esta parecen tener muy bajos puntos de vista y respuestas …
- ¿Cómo utilizo 'RotateDrawable'?
- Service.onDestroy () se llama directamente después de la creación, de todos modos el servicio hace su trabajo