AutoCompleteTextView отображает "android.database.sqlite.SQLiteCursor @"... после выбора

Я использую следующий код для установки адаптера (SimpleCursorAdapter) для AutoCompleteTextView

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

и thi - это 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?

спасибо

патрик

Ответ 1

Я не думаю, что вам нужно обновить текст для AutoCompleteTextView. Он должен делать это автоматически. Он делает это, вызывая метод [CursorAdapter.convertToString(...)] [1]. если вы прочитаете описание метода, это указывает на это. Поэтому, если вы пишете свой собственный CursorAdapter, вы переопределите этот метод, чтобы вернуть текст, который вы хотите отобразить в списке предложений. Этот парень хорошо объясняет, как это сделать:

Линия 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 укажет вам правильные страницы документов.

Ответ 2

[Поздний ответ, только для записи. РЕДАКТИРОВАНО, чтобы удалить мое предложение о необходимости подклассификации.]

Чтобы использовать SimpleCursorAdapter с AutoCompleteTextView, вам нужно установить два обработчика на адаптере: CursorToStringConverter, а FilterQueryProvider. Ниже следует псевдокод:

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

Ответ 3

Когда я делаю выбор из списка Я получаю объект sqlite ( 'Android.database.sqlite.SQLiteCursor @... ) в тексте.

Вы не говорите, что такое "текстовое представление" или как оно относится к Spinner.

Я собираюсь принять обоснованное предположение и предположить, что вы просто назначаете выделенный элемент из Spinner в TextView.

Выбранный элемент из Spinner с помощью SimpleCursorAdapter - это Cursor, указывая на строку, выбранную пользователем. Реализация toString() Cursor даст вам нечто похожее на [email protected] в зависимости от того, откуда пришел Cursor.

Скорее всего, вы захотите вызвать getString() на Cursor, чтобы получить некоторое значение столбца и назначить его TextView.

Ответ 4

Чтобы решить проблему, я просто расширил SimpleCursorAdapter и реализовал метод convertToString(). Затем я создал экземпляр и установил его как адаптер.

Чтобы разрешить фильтрацию в AutoCompleteTextView при использовании CursorAdapters, я также использовал setFilterQueryProvider(). См. этот вопрос.

Мой расширенный класс внутри Activity выглядит следующим образом:

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