0

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

У меня есть 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 возвращает значение запрашиваемого столбца в виде String, и поскольку есть только 2 столбца, выбирая предложение в ACTV, положение которого (позиция, как показано пользователю, а не позиция указанного элемента в списке) больше, чем 2, вызывает зависание кода.

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

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

Edit:

использование 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, индексированное ноль.

+1

Придется попробовать первый 'c.moveToFirst();' –

+0

я поставил 'c.moveToFirst();' перед блоком попытка поймать и это не помогло. – Razgriz

+0

Какова ценность 'item id в позиции' ?? –

ответ

0

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

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.... 
     **/ 
    }  
} 
+0

Это не работает. См. Редактирование, которое я сделал с вашим ответом. – Razgriz

0

Сделано это работает с использованием другого подхода. Я получаю представление и отбрасываю его как TextView. Оттуда я получаю вход String. Затем я использую эту строку и просматриваю ее позицию в исходном списке. Обратите внимание, что мой список - это массив, а не 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); 
    } 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^