【问题标题】:AutoCompleteTextView displays 'android.database.sqlite.SQLiteCursor@'... after making selection选择后 AutoCompleteTextView 显示 'android.database.sqlite.SQLiteCursor@'...
【发布时间】:2010-01-29 03:16:45
【问题描述】:

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

这是实际控制的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 的更新有任何想法吗?

谢谢

帕特里克

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

    我认为您不必更新 AutoCompleteTextView 的文本。它应该自动完成。它通过调用 [CursorAdapter.convertToString(...)][1] 方法来做到这一点。如果您阅读该方法的描述,它会指出这一点。因此,如果您正在编写自己的 CursorAdapter,您将覆盖该方法以返回您希望显示在建议列表中的任何文本。这个人很好地解释了如何做到这一点:

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

    但是,由于您使用的是 SimpleCursorAdapter,因此无法覆盖此方法。相反,您需要实现/创建一个 [SimpleCursorAdapter.CursorToStringConverter][2] 并将其传递给 [Si​​mpleCursorAdapter.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 一起使用,您需要在适配器上设置两个处理程序:CursorToStringConverterFilterQueryProvider。伪代码如下:

          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@'... ) 在文本视图中。

        你没有说这个“textview”是什么或者它与Spinner有什么关系。

        我将进行有根据的猜测,并假设您只是将所选项目从Spinner 分配到TextView

        使用SimpleCursorAdapterSpinner 中选择的项目是Cursor,指向用户选择的行。 Cursor 的 toString() 实现将为您提供类似于 android.database.sqlite.SQLiteCursor@ 的内容,具体取决于 Cursor 的来源。

        更有可能的是,您将要在该Cursor 上调用getString(),以检索一些列值,并将其分配给相关TextView

        【讨论】:

        • 是的,你是对的。我只是从作为 AutoCompleteTextView 的一部分创建的微调器中选择一个选项。我在哪里或如何截取处理选择的功能;在将光标设置为控件文本之前,在光标上使用 getString()。我还将添加我的 xml。
        • “我在哪里或如何截取处理选择的功能”——你已经在这样做了。在某个地方,您在 TextView 上调用 setText()。编辑该代码。
        • 这就是重点……我不是。填充 AutoCompleteTextView 小部件的 TextView 部分的是 AutoCompleteTextView 小部件的内置行为。
        • 好吧,我想我可能已经想通了。设置一个 OnItemSelectedListener()。我测试后会回答。
        • :: 撞到额头 :: 抱歉,我这里有精神障碍。我没有使用SimpleCursorAdapter 和AutoCompleteTextView,所以我不知道该组合的正确配方。
        【解决方案4】:

        为了解决这个问题,我只是扩展了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"));
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-02-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-07
          相关资源
          最近更新 更多