ListView, itens verificáveis não são verificados no Android 1.6
-
27-10-2019 - |
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?
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.