Похоже, что это связано с реализацией Android AbstractCursor и в Jellybean не работает.
Я реализовал следующий модульный тест, чтобы продемонстрировать мне проблему с помощью MatrixCursor:
@Test
public void testCursor() {
MatrixCursor cursor = new MatrixCursor(new String[] { "id" });
for (String s : new String[] { "1", "2", "3" }) {
cursor.addRow(new String[] { s });
}
cursor.moveToPosition(0);
assertThat(cursor.moveToPrevious(), is(true));
cursor.moveToPosition(cursor.getCount()-1);
assertThat(cursor.moveToNext(), is(true));
assertThat(cursor.moveToPosition(c.getCount()), is(true));
assertThat(cursor.moveToPosition(-1), is(true));
}
Все утверждения не выполняются, в отличие от документации для moveToNext, moveToPrevious и moveToPosition.
При чтении кода в API 16 для AbstractCursor.moveToPosition (int position) это выглядит как намеренное поведение, то есть методы явно возвращают false в этих случаях, в отличие от документации.
Какпримечание: поскольку код Android, установленный на существующих устройствах, не может быть изменен, я принял подход написания своего кода, чтобы он соответствовал поведению существующей реализации Android, а не документации.то есть.При реализации моих собственных Cursors / CursorWrappers я переопределяю методы и пишу свой собственный javadoc, описывающий отход от существующей документации.Таким образом, мои Cursors / CursorWrappers остаются взаимозаменяемыми с существующими курсорами Android без нарушения поведения во время выполнения.