Извините за глоток заголовка, я должен его сократить, потому что я превысил предел в 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, индексированное ноль.
Придется попробовать первый 'c.moveToFirst();' –
я поставил 'c.moveToFirst();' перед блоком попытка поймать и это не помогло. – Razgriz
Какова ценность 'item id в позиции' ?? –