该应用有一个启用了多选功能的 ListView,在 UI 中它按预期工作。但是当我使用此代码读出值时:
Log.i(TAG,"Entered SearchActivity.saveCategoryChoice()");
SparseBooleanArray checkedPositions = categorySelector.getCheckedItemPositions();
Log.i(TAG,"checkedPositions: " + checkedPositions.size());
if (checkedPositions != null) {
int count = categoriesAdapter.getCount();
for ( int i=0;i<count;i++) {
Log.i(TAG,"Selected items: " + checkedPositions.get(i));
}
}
无论每个复选框处于什么状态,我都会得到这个输出:
Entered SearchActivity.saveCategoryChoice()
checkedPositions: 0
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
SparseBooleanArray似乎对于任何不存在的项目都返回 false,所以问题的根源似乎是 getCheckedItemPositions() 返回一个空数组。该方法的行为就像 ListView 中没有项目,但确实存在。
我可以从文档中看到,当 ListView 未设置为多选时不会返回任何值,但使用以下语句:
categorySelector.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
在我的场景中,我使用的适配器是 ArrayAdapter 的子类,并且(没有任何确凿证据)我怀疑这可能是原因,但我不明白为什么它不应该工作。
最佳答案
kcoppock 是对的,你需要使用 valueAt(),工作代码应该是
SparseBooleanArray checkedItems = categorySelector.getCheckedItemPositions();
if (checkedItems != null) {
for (int i=0; i<checkedItems.size(); i++) {
if (checkedItems.valueAt(i)) {
String item = categorySelector.getAdapter().getItem(
checkedItems.keyAt(i)).toString();
Log.i(TAG,item + " was selected");
}
}
}
关于android - 为什么 ListView.getCheckedItemPositions() 没有返回正确的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3996938/