【问题标题】:whats the equivilent of getCheckedItemCount() for API level < 11?API 级别 < 11 的 getCheckedItemCount() 等效项是什么?
【发布时间】:2012-09-08 12:15:52
【问题描述】:

我正在使用此方法检查列表中有多少项已检查,我收到此错误,表明此方法不适用于任何早于 11 的 SDK。

API 级别 8 中 this 的等价物是什么

【问题讨论】:

    标签: android compatibility


    【解决方案1】:

    接受的答案对我不起作用(总是返回 0),我不得不使用以下代码:

    public static int getCheckedItemCount(ListView listView)
    {
        if (Build.VERSION.SDK_INT >= 11) return listView.getCheckedItemCount();
        else
        {
            int count = 0;
            for (int i = listView.getCount() - 1; i >= 0; i--)
                if (listView.isItemChecked(i)) count++;
            return count;
        }
    }
    

    【讨论】:

    • 迭代 listView.getCheckedItemPositions() 会更有效(它是一个SparseBooleanArray)并仅在positions.valueAt(idx) 为真时增加count++
    • @Joe 的问题是,如果我没记错的话,isItemChecked 是在我的情况下唯一可靠工作的方法!
    • 这通常意味着SparseBooleanArray 被滥用了。它不是所有选中项的数组,它是已修改项的稀疏数组,稀疏数组中的值是一个布尔值,表示是否选中。您不能使用SparseBooleanArray#size() 来确定@​​987654328@ - 您必须迭代SparseBooleanArray 并检查该值以确保它是真的。
    • @Joe 假设我的记忆没有出卖我,那确实是我的第一个方法!出于某种原因,我记得它在不同的 API 版本中不一致。但是话又说回来,由于时间限制,我没有时间正确测试它,我可能会弄错。
    【解决方案2】:

    getCheckedItemIds().length 似乎可以解决问题

    【讨论】:

    【解决方案3】:

    我正在使用我认为有效且适用于所有情况的代码:

    public int getCheckedItemCount() {
        ListView listView = getListView();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            return listView.getCheckedItemCount();
        }
    
        SparseBooleanArray checkedItems = listView.getCheckedItemPositions();
        int count = 0;
        for (int i = 0, size = checkedItems.size(); i < size; ++i) {
            if (checkedItems.valueAt(i)) {
                count++;
            }
        }
        return count;
    }
    

    如果您发现它不起作用的情况,请通知我。

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2012-02-21
      • 2012-07-24
      • 2012-12-27
      相关资源
      最近更新 更多