AutoCompleteTextView отображает 'android.database.sqlite.SQLiteCursor @' ... после выбора - PullRequest
10 голосов
/ 29 января 2010

Я использую следующий код для установки адаптера (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?

спасибо

патрик

Ответы [ 4 ]

9 голосов
/ 02 июня 2010

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

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

Извините, но блокировщик спама не позволяет мне публиковать ссылки на документацию по Android, в которой описаны ссылки, которые я разместил выше. Но быстрый поиск в Google покажет вам правильные страницы документа.

3 голосов
/ 15 ноября 2010

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

Чтобы использовать 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;
        }
    });
0 голосов
/ 06 марта 2012

Для решения проблемы я просто расширил 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"));
    }
}
0 голосов
/ 29 января 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...