ListView, проверяемые элементы не проверяются на Android 1.6 - PullRequest
1 голос
/ 20 октября 2011

Мое приложение в настоящее время нацелено на Android 1.6. Он содержит ListView с CHOICE_MODE_SINGLE . Все предметы реализуют Проверяемый . Я использую 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 ]

2 голосов
/ 20 октября 2011

Нашел проблему. Произошло изменение в 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();
  }
}
0 голосов
/ 20 октября 2011

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

. В нем говорится:

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

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

...