簡體   English   中英

如何過濾 AutoCompleteTextView 的結果?

[英]How to filter results of AutoCompleteTextView?

我有一個 AutoCompleteTextView 設置為使用一個 cursor 來遍歷我的聯系人。 問題是,我讓它正確填充下拉列表,但在我輸入后它沒有過濾結果。

這是我的 cursor 代碼和適配器設置:

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);

這是 simple_contact_textview 的 xml:

<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>

如何根據用戶輸入的內容過濾下拉結果? 例如,如果用戶開始輸入“and”,我將如何出現“andrew”、“andy”和“mandy”?

構造一個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);
}

對不起,如果我搶了任何人的答案。 像這樣的所有問題似乎都有很低的觀點和答案......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM