Pergunta

Meu aplicativo atualmente está direcionado ao Android 1.6. Ele contém um ListView com CHOICE_MODE_SINGLE . Todos os itens implementam Verificável . Estou usando setItemChecked (posição interna, booleano valor) para marcar / desmarcar itens conforme necessário. Funciona como esperado no Android 2.1, 2.2 e 2.3. No Android 1.6, entretanto, nenhum item é verificado.

O código se parece com este:

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;
}

Esta questão resolveu o problema configurando o ChoideMode de ListView em código, não em XML. Para começar, fiz isso em código e colocá-lo em XML não fez diferença para mim. O problema ainda ocorre.

Como posso fazer isso funcionar no Android 1.6?

Foi útil?

Solução

Encontrou o problema.Houve uma alteração em setItemChecked () entre 1.6 e 2.1.

1.6 sempre limparia os itens marcados quando setItemChecked () fosse chamado com o valor false.Portanto, a menos que o último item seja o marcado, ele terminará com uma matriz limpa, portanto, nenhum item marcado.

Isso pode ser contornado apenas chamando setItemChecked para o item selecionado.Desmarcar os outros itens é (obviamente) tratado pelo ListView.Se nenhum item deve ser verificado (checkIndex é nulo), devemos usar clearChoices () para garantir que nada seja verificado.Isso é útil nos casos em que o item marcado foi removido da lista e outro item assume a posição.Se não desmarcarmos a escolha, o ListView verificará essa posição, embora checksIndex seja nulo.

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

Outras dicas

Um problema pode estar em getCheckedItemPositions ()

Diz:

Retorna o conjunto de itens marcados na lista.O resultado só é válido se o modo de escolha não foi definido como CHOICE_MODE_NONE.

Portanto, provavelmente é melhor verificar o id / posição do item usando o listner de clique de item.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top