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 @' …) в текстовом виде. Кто-нибудь знает, что может вызвать это, или как это решить?

благодаря

Ok Я могу подключиться к событию 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?

благодаря

Патрик

Solutions Collecting From Web of "AutoCompleteTextView отображает «android.database.sqlite.SQLiteCursor@» после выбора"

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

[Поздний ответ, только для записи. 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; } }); 

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

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

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

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

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

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