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

и это 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, но часть TextView.setText() виджета AutoCompleteTextView обновляется после этого момента. Событие 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?

Спасибо

Патрик


person bugzy    schedule 29.01.2010    source источник


Ответы (4)


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

person plainjimbo    schedule 02.06.2010

[Поздний ответ, просто для протокола. EDITed, чтобы удалить мое предложение о необходимости создания подклассов.]

Чтобы использовать 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;
        }
    });
person Dan Breslau    schedule 15.11.2010

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

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

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

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

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

person CommonsWare    schedule 29.01.2010
comment
Да вы правы. Я просто выбираю один из вариантов из счетчика, созданного как часть AutoCompleteTextView. Где или как мне перехватить функциональность для обработки выбора; используйте getString() для курсора, прежде чем он будет установлен как текст элемента управления. Я также добавлю свой xml. - person bugzy; 29.01.2010
comment
Где или как я могу перехватить функциональность для обработки выбора - вы уже делаете это. Где-то вы вызываете setText() в TextView. Отредактируйте этот код. - person CommonsWare; 29.01.2010
comment
В том-то и дело... Я нет. Это встроенное поведение виджета AutoCompleteTextView, которое заполняет часть TextView виджета AutoCompleteTextView. - person bugzy; 29.01.2010
comment
Хорошо, я думаю, я, возможно, понял это. Настройте OnItemSelectedListener(). Отвечу после того, как проверю. - person bugzy; 29.01.2010
comment
:: хлопает себя по лбу :: Извини, у меня был ментальный блок. Я не использовал SimpleCursorAdapter с AutoCompleteTextView, поэтому я не знаю правильного рецепта для этой комбинации. - person CommonsWare; 29.01.2010

Чтобы решить проблему, я просто расширил 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"));
    }
}
person Caumons    schedule 06.03.2012