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

标签 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));
  }
}

无论每个复选框处于什么状态,我都会得到这个输出:

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/

相关文章:

java - Android:AsyncTask 中的 Jsoup

android - 缺少 dagger2 编译错误

java - Android ClassNotFoundException 与 appcompat-v7 :28. 0.0

android - Android 上的 Flutter Cloud Firestore 崩溃 - 空对象引用上的 Mutable Document.getKey()

android - BottomSheet 中的 ListView

Android OrmLite 刷新列表删除

android - 使用现有的 .keystore 签署 android apk

c# - DataTemplate 中带有 DoubleAnimation 的 Storyboard

delphi - 如何仅在某些列中设置带有复选框的 TListView?

android - cacheColorHint 导致 listView 滚动滞后