9

連絡先の上に移動するカーソルを使用するように 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);

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」を表示するにはどうすればよいでしょうか。

4

2 に答える 2

11

a を構築して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 インジェクション攻撃によって DB を損傷することはありません。

(実際のコンピューターの近くにないため、上記をテストすることはできません。おそらく、いくつかの構文エラーがあります。)

于 2011-06-10T01:14:58.100 に答える
1

最後に、うまくいったことを試しました:

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

誰かの答えを奪ったらごめんなさい。このような質問はすべて、見解と回答が非常に低いようです...

于 2011-06-10T00:39:50.690 に答える