ListView, проверяемые элементы не проверяются на Android 1.6

Мое приложение в настоящее время нацелено на Android 1.6. Он содержит ListView с CHOICE_MODE_SINGLE. Все предметы реализуют Checkable. Я использую setItemChecked(int position, boolean value) для проверки / снятия отметки с элементов по мере необходимости. Он работает как положено на Android 2.1, 2.2 и 2.3. На Android 1.6, однако, ни один элемент не проверяется.

Код выглядит так:

Integer checkedIndex = 0; // This is actually set from somewhere else.

void updateCheckedItem() {
  int count = adapter.getCount();
  for (int i = 0; i < count; i++) {
    listView.setItemChecked(i, isChecked(i));
  }

  // Here, we should have a checked item (unless checkedIndex was null)
  SparseBooleanArray checkedPositions = listView.getCheckedItemPositions();
  int size = checkedPositions.size();
  // On Android 1.6, size is 0 (wrong)
  // On Android 2.x, size is 1 (correct)

  // Another try...
  int checkedPosition = listView.getCheckedItemPosition();
  // On Android 1.6, checkedPosition is INVALID_POSITION (-1), meaning nothing is checked (wrong)
  // On Android 2.x, checkedPosition is whatever checkedIndex is (correct)
}

boolean isChecked(int position) {
  return checkedIndex != null && checkedIndex == position;
}

Этот вопрос решил проблему, установив ChoideMode в ListView в коде, а не в XML. Для начала я сделал это в коде, и для меня это не имело значения. Проблема все еще возникает.

Как я могу заставить это работать на Android 1.6?

2 ответа

Решение

Нашел проблему. Произошло изменение в setItemChecked() между 1.6 и 2.1.

1.6 всегда будет очищать отмеченные элементы, когда setItemChecked() вызывается со значением false. Таким образом, если последний элемент не был проверенным, он получал бы очищенный массив, следовательно, никаких проверенных элементов.

Это можно обойти, только вызвав setItemChecked для проверенного элемента. Снятие отметки с других элементов (очевидно) обрабатывается ListView. Если ни один элемент не должен быть проверен (checkIndex равен нулю), мы должны использовать clearChoices(), чтобы убедиться, что ничего не проверено. Это полезно в тех случаях, когда отмеченный элемент был удален из списка, а другой элемент занял позицию. Если мы не очистим выбор, ListView проверит эту позицию, хотя checkIndex имеет значение null.

void updateCheckedItem() {
  if (checkedIndex != null) {
    listView.setItemChecked(selected, true);
  } else {
    listView.clearChoices();
  }
}

Одна проблема может быть в getCheckedItemPositions()

Это говорит:

Возвращает набор отмеченных элементов в списке. Результат действителен, только если режим выбора не был установлен на CHOICE_MODE_NONE.

Так что, вероятно, лучше получить проверенный идентификатор элемента / положение, используя список щелчков по элементам.

Другие вопросы по тегам