AutoCompleteTextView显示'android.database.sqlite.SQLiteCursor@'…select后

我正在使用以下代码为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"/> 

下拉菜单似乎正常工作,并显示项目列表。 当我从列表中进行select时,我在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的更新?

谢谢

帕特里克

Solutions Collecting From Web of "AutoCompleteTextView显示'android.database.sqlite.SQLiteCursor@'…select后"

我不认为你应该更新AutoCompleteTextView的文本。 它应该自动执行。 它通过调用[CursorAdapter.convertToString(…)] [1]方法来实现。 如果你阅读方法的描述,它指出了这一点。 所以,如果你正在编写你自己的CursorAdapter,你可以重写这个方法来返回你想在build议列表中显示的任何文本。 这家伙做了很好的解释如何做到这一点:

第86行 – http://thinkandroid.wordpress.com/2010/02/08/writing-your-own-autocompletetextview/

但是,由于您正在使用SimpleCursorAdapter,因此无法重写此方法。 相反,你需要实现/创build一个[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); 

或者如果你不想创build一个CursorToStringConverter然后使用[SimpleCursorAdapter。 setStringConversionColumn(…)] [4]方法。 但我认为你仍然必须显式设置CursorToStringConverter为null:

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

对不起,但垃圾邮件拦截器不会让我发布链接到Android文档,描述我上面发布的链接。 但快速谷歌search将指向您正确的文档页面。

[最后的回答,只是为了logging。 编辑删除我的build议,子类化是必要的。]

要将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; } }); 

当我从列表中进行select时,我在textview中得到了一个sqlite对象('android.database.sqlite.SQLiteCursor @'…)。

你不会说这个“textview”是什么,或者它与Spinner

我将采取一个有教养的猜测,并假设您只是将选定的项目从Spinner分配到TextView

使用SimpleCursorAdapterSpinnerselect的项目是一个Cursor ,指向用户select的行。 Cursor的toString()实现会给你类似于android.database.sqlite.SQLiteCursor@东西,这取决于Cursor来源。

更可能的是,您将要调用该Cursor上的getString() ,以检索某个列值,并将其分配给有问题的TextView

为了解决这个问题,我只扩展了SimpleCursorAdapter并实现了convertToString()方法。 然后我创build了一个实例并将其设置为适配器。

为了在使用CursorAdapters时允许在AutoCompleteTextView进行过滤,我还使用了setFilterQueryProvider() 。 看到这个问题 。

我在活动中的扩展类看起来像:

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