Android - Использование SimpleCursorAdapter в AutoCompleteTextView дает CursorIndexOutofBoundsException, когда пользователь выбирает 3-е предложение вперед

Извините за заголовок, я должен сократить его, потому что я превысил ограничение в 150 символов.

у меня есть AutoCompleteTextView (ACTV), и я использую SimpleCursorAdapter поскольку обычный ACTV ищет только пользовательский ввод в начале каждой подстроки (подстрока разделена пробелами), а не внутри этих подстрок. Например, имея список с Adipose а также Bad Wolf и поиск ad покажет Adipose только и не Bad Wolf, Я уже сделал адаптер, как показано ниже:

//create ACTV Here
AutoCompleteTextView search = (AutoCompleteTextView) findViewById(R.id.actvCatalogueSearch);
search.setThreshold(1);

String[] from = { "name" };
int[] to = { android.R.id.text1 };

SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, 
        android.R.layout.simple_dropdown_item_1line, null, from, to, 0);

cursorAdapter.setStringConversionColumn(1);

FilterQueryProvider provider = new FilterQueryProvider(){
    @Override
    public Cursor runQuery(CharSequence constraint) {
        // TODO Auto-generated method stub
        String constrain = (String) constraint;
        constrain = constrain.toUpperCase();
        Log.d("hi", "runQuery constraint: " + constraint);
        if (constraint == null) {
            return null;
        }
        String[] columnNames = { Columns._ID, "name" };
        MatrixCursor c = new MatrixCursor(columnNames);
        try {
            for (int i = 0; i < pdflist.length; i++) {
                if(pdflist[i].contains(constrain)){
                    Log.d("Hello","Match! pdflist item = " + pdflist[i]);
                    c.newRow().add(i).add(pdflist[i]);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return c;
    }
};

cursorAdapter.setFilterQueryProvider(provider);
search.setAdapter(cursorAdapter);

Этот код позволяет мне показать другие элементы списка, которые содержат подстроку из пользовательского ввода.

Теперь я пытаюсь сделать OnItemClickListener работает правильно. Вот что у меня так далеко:

search.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        MatrixCursor matrix = (MatrixCursor)parent.getItemAtPosition(position);

        Log.d("hello", "matrix values is = " + matrix);

        String selection = matrix.getString(position);  
        Log.d("hallo","selection = " + selection);
        Log.d("hello","item id at position = " + parent.getItemIdAtPosition(position));

        int pos = (int) parent.getItemIdAtPosition(position);
        Log.d("sup", "position is = " + pos);
        String path = imagelist[pos].getAbsolutePath();
        openPdfIntent(path);
    }
});

Здесь я пытаюсь получить MatrixCursor элемент в данной позиции. Работает нормально, пользователь выбирает первые 2 предложения. Однако, когда пользователь нажимает 3-е предложение и далее, приложение выбрасывает CursorIndexOutOfBoundsException Requested Column: 2, # of columns: 2 Нажатие на строки logCat указало мне на код String selection = matrix.getString(position);

Я думаю что делаю matrix.getString(position) вызывает ошибку, так как getString возвращает значение запрошенного столбца в виде строки, и поскольку имеется только 2 столбца, выбирается предложение в ACTV, позиция которого (позиция, как это показано пользователю, а не позиция указанного элемента в список) больше 2 приводит к тому, что код испортится.

У меня вопрос, есть ли лучший способ получить значение String выбранного элемента, учитывая, что я использую SimpleCursorAdapter? Я просмотрел документацию по Matrix Cursor на сайте разработчика Android и не могу найти способ получить строку / элемент на основе позиции.

Любая помощь очень ценится.

Редактировать:

с помощью matrix.moveToFirst(); как таковой тоже не помог

search.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        MatrixCursor matrix = (MatrixCursor)parent.getItemAtPosition(position);
        if(matrix != null) {
            if(matrix.getCount() > 0) {
                matrix.moveToFirst();
                String selection = matrix.getString(position);  

                int pos = (int) parent.getItemIdAtPosition(position);
                String path = imagelist[pos].getAbsolutePath();
                openPdfIntent(path);
            }    
        }
    }
});

и я все еще получил исключение:

android.database.CursorIndexOutOfBoundsException: Requested column: 4, # of columns: 2

Запрашиваемая колонка 4 позиция выбранного предложения ACTV, индексированная ноль.

2 ответа

Попробуйте так

MatrixCursor matrix = .............

Log.d("hello", "matrix values is = " + matrix);

/***** Check here Cursor is NOT NULL *****/
if(matrix != null) {
    if(matrix.getCount() > 0) {
        matrix.moveToFirst();
        /***
        Your Stuff will be here....
        **/
    }    
}

Сделал так, чтобы он работал, используя другой подход. Я получаю вид и снимаю его как TextView. Оттуда я получаю String. Затем я использую эту строку и ищу ее положение в исходном списке. Обратите внимание, что мой список - это Array, а не ArrayList, поэтому мне пришлось пройтись по всем элементам.

search.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        TextView tv = (TextView) view;
        String userSelection = tv.getText().toString();
        Log.d("hello", "selection is = " + userSelection);

        int pos = -1;

        for (int i = 0; i < pdflist.length; i++) {
            if(pdflist[i].equalsIgnoreCase(userSelection)){
                pos = i;
            }
        }

        Log.d("hello","int position = " + pos);

        String path = imagelist[pos].getAbsolutePath();
        openPdfIntent(path);
    }
});
Другие вопросы по тегам