Wie filtert ich Ergebnisse von AutoCompletEtextView?
-
22-10-2019 - |
Frage
Ich habe ein AutoCompletEtextView -Set für einen Cursor, der meine Kontakte übergeht. Das Problem ist, dass ich den Dropdown korrekt besiedelt habe, aber es filtert die Ergebnisse nicht nach dem Typ.
Hier ist mein Code für den Cursor und die Einstellung des Adapters:
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);
Und hier ist der XML für 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>
Wie filtere ich die Dropdown -Ergebnisse basierend auf dem, was der Benutzer eingreift? Wenn zum Beispiel der Benutzer anfängt zu tippen "und", wie hätte ich "Andrew", "Andy" und "Mandy" erscheinen?
Lösung
Konstrukt a FilterQueryProvider
und übergeben es 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);
}
});
Der obige Code gibt die Ergebnisse zurück, die überall in der Zeichenfolge übereinstimmen (nicht nur am Anfang. Da er parametrisierte Abfragen verwendet, können Ihre Benutzer die DB nicht über einen SQL -Injektionsangriff beschädigen.
(Nicht in der Nähe eines tatsächlichen Computers, also kann ich das oben genannte nicht testen - wahrscheinlich einige Syntaxfehler dort.)
Andere Tipps
Versuchte endlich etwas, das funktionierte:
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);
}
Entschuldigung, wenn ich jemandem eine Antwort ausgeraubt habe. Alle Fragen wie diese scheinen sehr niedrige Ansichten und Antworten zu haben ...