我使用以下代码为AutoCompleteTextView设置适配器(SimpleCursorAdapter)
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"/>
下拉列表似乎正常工作,并显示项目列表。当我从列表中做出选择时,我在textview中得到一个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的更新有任何想法吗?
感谢
帕特里克
答案 0 :(得分:9)
我认为您不必更新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文档的链接。但快速谷歌搜索会指向正确的文档页面。
答案 1 :(得分:3)
[迟到的回答,仅供记录。编辑以删除我的建议,即子类化是必要的。]
要将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;
}
});
答案 2 :(得分:0)
当我从列表中进行选择时 我得到一个sqlite对象 ( 'android.database.sqlite.SQLiteCursor @' ...... )在textview中。
您没有说明这个“textview”是什么或它与Spinner
的关系。
我将采取有根据的猜测,并假设您只是将Spinner
中的所选项目分配到TextView
。
使用Spinner
的{{1}}中的所选项目是SimpleCursorAdapter
,指向用户选择的行。 Cursor
的toString()实现将为您提供类似Cursor
的内容,具体取决于android.database.sqlite.SQLiteCursor@
的来源。
更有可能的是,您希望在Cursor
上致电getString()
,以检索某些列值,并将其分配给相关的Cursor
。
答案 3 :(得分:0)
要解决此问题,我只是展开了SimpleCursorAdapter
并实施了方法convertToString()
。然后我创建了一个实例并将其设置为适配器。
为了在使用CursorAdapters时允许在AutoCompleteTextView
中进行过滤,我还使用了setFilterQueryProvider()
。 See this question
我在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"));
}
}