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