为什么ListView.getCheckedItemPositions()没有返回正确的值?

Oll*_*e C 27 android listview

该应用程序具有启用了多选的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)


kco*_*ock 6

我记得有一段时间我自己遇到了这个问题.是我之前的问题,它与您的问题没有直接关系,但包含一些可能有用的代码.您可能想要尝试的是使用checkedPositions.valueAt(int index)而不是checkedPositions.get(int index).我想这可能就是你真正想要的.


Oll*_*e C 4

我仍然不知道为什么,但在我的场景中,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)