Come filtrare i risultati di AutoCompleteTextView?
-
22-10-2019 - |
Domanda
Ho un insieme AutoCompleteTextView per utilizzare un cursore che va oltre i miei contatti. Il problema è che ho è popolare la discesa correttamente, ma non è filtrando i risultati dopo digito.
Ecco il mio codice per il cursore e l'impostazione della scheda:
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);
Ed ecco il XML per 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>
Come faccio a filtrare i risultati in discesa in base a ciò che l'utente sta scrivendo? Per esempio, se l'utente inizia a digitare "e", come avrei "Andrew", "Andy", e "Mandy" appaiono?
Soluzione
Costruire una FilterQueryProvider
e passarlo in 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);
}
});
Il codice di cui sopra restituirà i risultati che corrispondono a qualunque punto della stringa (non solo in principio. Inoltre, dal momento che utilizza query con parametri, gli utenti non saranno in grado di danneggiare il DB tramite un attacco di SQL injection.
(non vicino a un computer vero e proprio, quindi non posso testare i sopra -. Probabilmente alcuni errori di sintassi nei lì)
Altri suggerimenti
Infine provato qualcosa che ha funzionato:
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);
}
Scusa se ho rubato a nessuno di una risposta. Tutte le domande di questo tipo sembrano avere opinioni molto bassi e le risposte ...