AutoCompleteTextView displays 'android.database.sqlite.SQLiteCursor@'… after making selection

前端 未结 4 1742
春和景丽
春和景丽 2021-02-08 10:25

I am using the following code to set the adapter (SimpleCursorAdapter) for an AutoCompleteTextView

mComment = (AutoCompleteTextView) findViewById(R.id.comment);
         


        
相关标签:
4条回答
  • 2021-02-08 10:51

    When I make a selection from the list I get a sqlite object ('android.database.sqlite.SQLiteCursor@'... ) in the textview.

    You do not say what this "textview" is or how it relates to the Spinner.

    I am going to take an educated guess and assume that you are simply assigning the selected item out of the Spinner into the TextView.

    The selected item from a Spinner using a SimpleCursorAdapter is a Cursor, pointing at the row the user selected. The toString() implementation of Cursor will give you something akin to android.database.sqlite.SQLiteCursor@ depending on where the Cursor came from.

    More likely, you are going to want to call getString() on that Cursor, to retrieve some column value, and assign it to the TextView in question.

    0 讨论(0)
  • 2021-02-08 11:00

    [Late answer, just for the record. EDITed to remove my suggestion that subclassing is necessary.]

    To use SimpleCursorAdapter with an AutoCompleteTextView, you need to set two handlers on the adapter: The CursorToStringConverter, and the FilterQueryProvider. Pseudocode follows:

        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;
            }
        });
    
    0 讨论(0)
  • 2021-02-08 11:13

    I don't think you should have to update the text for the AutoCompleteTextView. It should do it automatically. It does this by calling the [CursorAdapter.convertToString(...)][1] method. if you read the description of the method it points this out. So if you were writing your own CursorAdapter you would override that method to return whatever text you would want to show up in the list of suggestions. This guy does a good job of explaining how to do it:

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

    However, since you are using a SimpleCursorAdapter, you can't override this method. Instead you need implement/create a [SimpleCursorAdapter.CursorToStringConverter][2] and pass it into [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);
    

    Or if you don't want to create a CursorToStringConverter then use the [SimpleCursorAdapter. setStringConversionColumn(...)][4] method. But I think you still have to explicitly set the CursorToStringConverter to null:

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

    Sorry, but the spam blocker won't let me post the links to the Android Documentation that describes the links I posted above. But a quick google search will point you to the correct doc pages.

    0 讨论(0)
  • 2021-02-08 11:13

    To solve the problem I just extended SimpleCursorAdapter and implemented the method convertToString(). Then I created an instance and set it as the adapter.

    In order to allow filtering in AutoCompleteTextView when using CursorAdapters I also used setFilterQueryProvider(). See this question.

    My extended class inside the Activity looks as:

    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"));
        }
    }
    
    0 讨论(0)
提交回复
热议问题