2013-09-01 3 views
2

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

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

Проблема в том, что не все записи проверяются в конце. Очень странно. После некоторого тестирования я заметил, что если у меня есть 10 записей в объединении (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

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

+0

это как раз, спасибо! см. мои комментарии ниже –

ответ

3

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

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

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