该应用程序有一个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
The 稀疏布尔数组 https://developer.android.com/reference/android/util/SparseBooleanArray.html似乎对于任何不存在的项目返回 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");
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)