该应用程序具有启用了多选的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));
}
}
Run Code Online (Sandbox Code Playgroud)
无论每个复选框处于什么状态,我都会得到此输出:
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
Run Code Online (Sandbox Code Playgroud)
该SparseBooleanArray似乎对任何不存在的项目返回false,这样的问题的根源似乎是getCheckedItemPositions()将返回一个空数组.该方法的行为就好像ListView中没有项目,但有.
我可以从文档中看到,当ListView未设置为多选时,没有返回任何值,但是,使用此语句:
categorySelector.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
Run Code Online (Sandbox Code Playgroud)
在我的场景中,我正在使用的适配器是ArrayAdapter的子类,并且(没有任何确凿的证据)我怀疑这可能是原因,但我不明白为什么它不应该工作.
bue*_*rgi 47
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我仍然不知道为什么,但在我的场景中,getCheckedItemPositions()为所有项目返回错误值。我看不到使用 ListView 上的方法来获取布尔值的方法。SparseBooleanArray 对象中似乎没有真实世界的数据。我怀疑这可能是因为我的实现的一些怪癖,也许我已经子类化了 ArrayAdapter。令人沮丧的是,像这样的问题确实会浪费时间。
无论如何,我使用的解决方案是在创建 ListView 行时将处理程序单独附加到每个复选框。所以从ListView.getView()我开始调用这个方法:
private void addClickHandlerToCheckBox(CheckBox checkbox) {
checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
CheckBox checkbox = (CheckBox)arg0;
boolean isChecked = checkbox.isChecked();
// Store the boolean value somewhere durable
}
});
}
Run Code Online (Sandbox Code Playgroud)