Как и многие другие вещи, множественный выбор ListView
с представляет собой реальную проблему в Android.
Вместо того, чтобы просто запрашивать выбранные элементы как List
из Object
с (уважаемый Google,это то, что мы ожидаем):
List selected_items = my_list_view.getSelectedItems();
мы вынуждены использовать этот невероятно нелепый API:
SparseBooleanArray checked = my_list_view.getCheckedItemPositions();
int num_selected = 0;
for(int i = 0; i < checked.size(); i++) {
if(checked.valueAt(i)) {
num_selected++;
int key = checked.keyAt(i);
boolean value = checked.get(key);
if (value) {
//
}
}
}
Ужасно названный SparseBooleanArray
заполняется путем вызова еще более ужасно названногоgetCheckedItemPositions()
на ListView
.Но вместо того, чтобы возвращать позиции каждого выбранного / отмеченного элемента в списке, он возвращает позицию каждого элемента в списке, к которому БЫЛ когда-либо касался, независимо от того, выбран ли он на самом деле или нет! Невероятно, но верно,
Чтобы вычислить, проверен ли предмет НАСТОЯЩЕМУ ТОЧНО, мы вынуждены проверить valueAt(i)
на правдивость при циклическом просмотре массива предметов, которые когда-либо касались.
В дополнение к этому безумию, если мы хотим рассчитать количество выбранных элементов, мы, похоже, вынуждены увеличивать наш собственный счетчик (например, num_selected
).
С такими API-интерфейсами неудивительно, что разработчики злятся!