在Android 1.6上没有检查ListView,Checkable项目

时间:2011-10-20 07:39:00

标签: android listview checked android-1.6-donut

我的应用目前针对的是Android 1.6。它包含一个带CHOICE_MODE_SINGLE的ListView。所有项目都实施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;
}

This question通过在代码中设置ListView的ChoideMode而不是XML来解决问题。我在代码中开始使用它并将其放入XML中对我没什么影响。问题仍然存在。

如何在Android 1.6上完成这项工作?

2 个答案:

答案 0 :(得分:2)

发现问题。 setItemChecked()中的change介于1.6和2.1之间。

1.6当调用setItemChecked()并使用值false时,将始终清除已检查的项目。因此,除非最后一项是经过检查的项目,否则它将以清除的数组结束,因此没有检查项目。

可以通过仅为已检查项调用setItemChecked来规避它。取消选中其他项目(显然)由ListView处理。如果没有要检查的项目(checkedIndex为null),我们应该使用clearChoices()来确保没有检查任何内容。这在从列表中删除已检查项目而另一项目占据位置的情况下非常有用。如果我们不清除选择,ListView将检查该位置,尽管checkedIndex为null。

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

答案 1 :(得分:0)

getCheckedItemPositions()

可能存在一个问题

它说:

  

返回列表中的已检查项目集。结果只有效   如果选择模式尚未设置为CHOICE_MODE_NONE。

因此,最好使用项目点击列表器来获取已检查的项目ID /位置。