10

次のコードを使用して、AutoCompleteTextViewのアダプター(SimpleCursorAdapter)を設定しています

mComment = (AutoCompleteTextView) findViewById(R.id.comment);

    Cursor cComments = myAdapter.getDistinctComments();
    scaComments = new SimpleCursorAdapter(this,R.layout.auto_complete_item,cComments,new String[] {DBAdapter.KEY_LOG_COMMENT},new int[]{R.id.text1});

    mComment.setAdapter(scaComments);

auto_complete_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

これは実際のコントロールのxmlです

<AutoCompleteTextView
                        android:id="@+id/comment"
                        android:hint="@string/COMMENT"
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:textSize="18dp"/>

ドロップダウンは正しく機能しているように見え、アイテムのリストが表示されます。リストから選択すると、テキストビューにsqliteオブジェクト('android.database.sqlite.SQLiteCursor @'...)が表示されます。何がこれを引き起こすのか、またはこれを解決する方法を知っている人はいますか?

ありがとう

OnItemClickイベントにフックすることはできますが、AutoCompleteTextViewウィジェットのTextView.setText()部分はこの時点以降に更新されます。OnItemSelected()イベントが発生することはなく、ドロップダウンアイテムが最初に表示されたときにonNothingSelected()イベントが発生します。

       mComment.setOnItemClickListener( new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub

            SimpleCursorAdapter sca = (SimpleCursorAdapter) arg0.getAdapter();


            String str = getSpinnerSelectedValue(sca,arg2,"comment");

            TextView txt = (TextView) arg1;
            txt.setText(str);
            Toast.makeText(ctx, "onItemClick", Toast.LENGTH_SHORT).show();

        }

    });
    mComment.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {


            Toast.makeText(ctx, "onItemSelected", Toast.LENGTH_SHORT).show();

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
            Toast.makeText(ctx, "onNothingSelected", Toast.LENGTH_SHORT).show();
        }

    });

TextViewの更新をオーバーライドする方法について他に何かアイデアはありますか?

ありがとう

パトリック

4

4 に答える 4

9

AutoCompleteTextView のテキストを更新する必要はないと思います。自動的に行う必要があります。[CursorAdapter.convertToString(...)][1] メソッドを呼び出すことでこれを行います。メソッドの説明を読むと、これが指摘されます。したがって、独自の CursorAdapter を作成している場合は、そのメソッドをオーバーライドして、提案のリストに表示したいテキストを返すようにします。この男は、その方法をうまく説明しています:

Line 86 - http://thinkandroid.wordpress.com/2010/02/08/writing-your-own-autocompletetextview/

ただし、SimpleCursorAdapter を使用しているため、このメソッドをオーバーライドすることはできません。代わりに、[SimpleCursorAdapter.CursorToStringConverter][2] を実装/作成し、[SimpleCursorAdapter.setCursorToStringConverter(...)][3] に渡す必要があります。

 SimpleCursorAdapter adapter = new SimpleCursorAdapter(context, layout, cursor, from, to);
 CursorToStringConverter converter = new CursorToStringConverter() {

    @Override
    public CharSequence convertToString(Cursor cursor) {
       int desiredColumn = 1;
       return cursor.getString(desiredColumn);
    }
 }; 

 adapter.setCursorToStringConverter(converter);

または、CursorToStringConverter を作成したくない場合は、[SimpleCursorAdapter. setStringConversionColumn(...)][4] メソッド。ただし、 CursorToStringConverter を明示的に null に設定する必要があると思います。

 int desiredColumn = 1;
 adapter.setCursorToStringConverter(null);
 adapter.setStringConversionColumn(desiredColumn);

申し訳ありませんが、スパム ブロッカーにより、上記で投稿したリンクについて説明している Android ドキュメントへのリンクを投稿できません。しかし、Google で簡単に検索すると、正しいドキュメント ページが表示されます。

于 2010-06-02T18:21:24.620 に答える
3

[記録のために、遅い答え。サブクラス化が必要であるという私の提案を削除するために編集されました。]

AutoCompleteTextViewでSimpleCursorAdapterを使用するには、アダプターに2つのハンドラー(CursorToStringConverterFilterQueryProvider )を設定する必要があります。擬似コードは次のとおりです。

    adapter.setCursorToStringConverter(new CursorToStringConverter() {
        public String convertToString(android.database.Cursor cursor) {
            // Assume that "someColumn" contains the strings that we want to
            // use to identify rows in the result set.
            final int columnIndex = cursor.getColumnIndexOrThrow("someColumn");
            final String str = cursor.getString(columnIndex);
            return str;
        }
    });

    adapter.setFilterQueryProvider(new FilterQueryProvider() {
        public Cursor runQuery(CharSequence constraint) {
            // runSomeQuery will look for all rows in the database
            // that match the given constraint.
            Cursor cursor = runSomeQuery(constraint);
            return cursor;
        }
    });
于 2010-11-15T20:20:20.620 に答える
0

リストから選択すると、textview に sqlite オブジェクト ('android.database.sqlite.SQLiteCursor@'...) が表示されます。

この「テキストビュー」が何であるか、またはSpinner.

経験に基づいた推測を行い、選択したアイテムを から に割り当てているだけだと仮定しSpinnerますTextView

Spinneraを使用して aから選択された項目はSimpleCursorAdapterCursorユーザーが選択した行を指している です。の toString() 実装は、どこから来たかに応じて、Cursor似たようなものを提供します。android.database.sqlite.SQLiteCursor@Cursor

getString()おそらく、それを呼び出してCursor、列の値を取得し、それを問題の に割り当てたいと思うでしょうTextView

于 2010-01-29T11:38:33.650 に答える
0

問題を解決するためにSimpleCursorAdapter、メソッドを拡張して実装しましたconvertToString()。次に、インスタンスを作成し、それをアダプターとして設定しました。

AutoCompleteTextViewCursorAdapters を使用するときにフィルタリングできるようにするために、も使用しsetFilterQueryProvider()ました。この質問を参照してください

アクティビティ内の私の拡張クラスは次のようになります。

private static class AutoCompleteCursorAdapter extends SimpleCursorAdapter {

    public AutoCompleteCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
        super(context, layout, c, from, to);
    }

    @Override
    public CharSequence convertToString(Cursor cursor) {
        // This is the method that does the trick (return the String you need)
        return cursor.getString(cursor.getColumnIndex("name"));
    }
}
于 2012-03-06T15:21:55.433 に答える