listview setItemChecked не работает должным образом

У меня возникла проблема со списком, заполненным курсором слияния. У меня есть кнопка в моем приложении, чтобы выбрать все записи в моем списке. Функция, вызываемая при нажатии кнопки, следующая:

private void selectAllEntries() {
    int numberOfItemsInList = listView.getCount();
    for (int i = 0; i < numberOfItemsInList; i++) {
        this.listView.setItemChecked(i, true);
    }
}

Проблема в том, что в конце проверяются не все записи. Очень странно. После некоторого тестирования я заметил, что если у меня есть 10 записей в mergecursor (5 от курсора a и 5 от курсора b), то если я только использую setItemChecked на первых 5 элементах, все работает хорошо (эти 5 записей проверяются). Если я снова использую setItemchecked на последних 5 элементах, все работает нормально (записи из курсора b проверяются), но если я использую setItemChecked для элементов из обоих курсоров, то максимальное количество проверяемых элементов - это количество элементов в курсоре a (5 в нашем примере), со смещением (количество элементов, которые я хотел установить - количество элементов в курсоре a). Я напишу пару примеров, так как это очень странное поведение.

Example 1:
element 0 (from cursor a, unchecked)
element 1 (from cursor a, unchecked)
element 2 (from cursor a, unchecked)
element 3 (from cursor a, unchecked)
element 4 (from cursor a, unchecked)
element 5 (from cursor b, unchecked)
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked)
element 8 (from cursor b, unchecked)
element 9 (from cursor b, unchecked)

setItemChecked(0,true);
setItemChecked(1,true);
setItemChecked(2,true);
setItemChecked(3,true);
setItemChecked(4,true);

Results:

element 0 (from cursor a, checked)
element 1 (from cursor a, checked)
element 2 (from cursor a, checked)
element 3 (from cursor a, checked)
element 4 (from cursor a, checked)
element 5 (from cursor b, unchecked)
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked)
element 8 (from cursor b, unchecked)
element 9 (from cursor b, unchecked)

Example 2:
element 0 (from cursor a, unchecked)
element 1 (from cursor a, unchecked)
element 2 (from cursor a, unchecked)
element 3 (from cursor a, unchecked)
element 4 (from cursor a, unchecked)
element 5 (from cursor b, unchecked)
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked)
element 8 (from cursor b, unchecked)
element 9 (from cursor b, unchecked)

setItemChecked(5,true);
setItemChecked(6,true);
setItemChecked(7,true);
setItemChecked(8,true);
setItemChecked(9,true);

results:

element 0 (from cursor a, unchecked)
element 1 (from cursor a, unchecked)
element 2 (from cursor a, unchecked)
element 3 (from cursor a, unchecked)
element 4 (from cursor a, unchecked)
element 5 (from cursor b, checked)
element 6 (from cursor b, checked) 
element 7 (from cursor b, checked)
element 8 (from cursor b, checked)
element 9 (from cursor b, checked)

Example 3:
element 0 (from cursor a, unchecked)
element 1 (from cursor a, unchecked)
element 2 (from cursor a, unchecked)
element 3 (from cursor a, unchecked)
element 4 (from cursor a, unchecked)
element 5 (from cursor b, unchecked)
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked)
element 8 (from cursor b, unchecked)
element 9 (from cursor b, unchecked)

setItemChecked(0,true);
setItemChecked(1,true);
setItemChecked(2,true);
setItemChecked(3,true);
setItemChecked(4,true);
setItemChecked(5,true);

results in

element 0 (from cursor a, unchecked)
element 1 (from cursor a, checked)
element 2 (from cursor a, checked)
element 3 (from cursor a, checked)
element 4 (from cursor a, checked)
element 5 (from cursor b, checked)
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked)
element 8 (from cursor b, unchecked)
element 9 (from cursor b, unchecked)


Example 4:
element 0 (from cursor a, unchecked)
element 1 (from cursor a, unchecked)
element 2 (from cursor a, unchecked)
element 3 (from cursor a, unchecked)
element 4 (from cursor a, unchecked)
element 5 (from cursor b, unchecked)
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked)
element 8 (from cursor b, unchecked)
element 9 (from cursor b, unchecked)

setItemChecked(0,true);
setItemChecked(1,true);
setItemChecked(2,true);
setItemChecked(3,true);
setItemChecked(4,true);
setItemChecked(5,true);
setItemChecked(6,true);

results:

element 0 (from cursor a, unchecked)
element 1 (from cursor a, unchecked)
element 2 (from cursor a, checked)
element 3 (from cursor a, checked)
element 4 (from cursor a, checked)
element 5 (from cursor b, checked)
element 6 (from cursor b, checked) 
element 7 (from cursor b, unchecked)
element 8 (from cursor b, unchecked)
element 9 (from cursor b, unchecked)


Example 5:
element 0 (from cursor a, unchecked)
element 1 (from cursor a, unchecked)
element 2 (from cursor a, unchecked)
element 3 (from cursor a, unchecked)
element 4 (from cursor a, unchecked)
element 5 (from cursor b, unchecked)
element 6 (from cursor b, unchecked) 
element 7 (from cursor b, unchecked)
element 8 (from cursor b, unchecked)
element 9 (from cursor b, unchecked)

setItemChecked(0,true);
setItemChecked(1,true);
setItemChecked(2,true);
setItemChecked(3,true);
setItemChecked(4,true);
setItemChecked(5,true);
setItemChecked(6,true);
setItemChecked(7,true);

results:

element 0 (from cursor a, unchecked)
element 1 (from cursor a, unchecked)
element 2 (from cursor a, unchecked)
element 3 (from cursor a, checked)
element 4 (from cursor a, checked)
element 5 (from cursor b, checked)
element 6 (from cursor b, checked) 
element 7 (from cursor b, checked)
element 8 (from cursor b, unchecked)
element 9 (from cursor b, unchecked)

Я использую

        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

а также

notifyDataSetChanged()

тоже не помогает Любая помощь?

Как примечание,

listView.getCount();

всегда возвращает правильное количество записей в представлении

1 ответ

Решение

Как сказал alanv: "CursorAdapter использует столбец _id из вашей базы данных для идентификации строк, а AbsListView использует это значение для отслеживания того, какие строки проверены. Похоже, ваш MergeCursor может возвращать повторяющиеся идентификаторы, например значение _id для первой строки в курсоре A совпадает с _id для первой строки в курсоре B. Так ли это?"

это именно тот случай. После изменения курсора на разные идентификаторы все работает нормально. Однако:

  1. Курсор слияния является объединением других курсоров, если курсор слияния не может обрабатывать идентичные идентификаторы, поступающие от разных подкурсоров (например, путем создания нового идентификатора внутри).
  2. Просмотр всех результатов курсора слияния и взаимодействие с ними (нажатие на них) работает нормально, поэтому я ожидаю, что проверка их работы будет работать правильно, как и она?
Другие вопросы по тегам