从ListView获取检查项时,使SparseBooleanArray.size()始终为0

时间:2012-11-24 17:42:17

标签: android listview

我正在使用listview中的复选框,并希望在ListView中获取所选项。问题是,即使在listView中选中了复选框,SparseBooleanArray.size()也始终保持为0。我搜索了很多但是问题仍然存在。这是我正在使用的代码:

checked = lvShowContacts.getCheckedItemPositions();
if(checked != null)
{
    for (int i=0; i<checked.size(); i++) {
        if (checked.valueAt(i)) {
            String item = lvShowContacts.getAdapter().getItem(
                    checked.keyAt(i)).toString();
            Log.v("Message",item + " was selected");
        }
    }
    Log.v("Message","checked.size() is "+ checked.size());
    //  else
    //the item is not checked, do something else
}

我总是以checked.size()0。请帮助我。谢谢。

4 个答案:

答案 0 :(得分:1)

使用SparseBooleanArray的一些提示:

让sba成为SparseBooleanArray对象。

sba.size()返回数组中的项目总数。 现在,数组包含Integer值到position的映射,在这种情况下,所选listview项的位置被映射到相应的布尔状态。 使用sba.keyAt(i)查找布尔数组的整数值,然后使用sba.get(sba.keyAt(i))查找映射到整数键的相应布尔值。

您可以像这样遍历数组:

SparseBooleanArray sba= getListView().getCheckedItemPositions();
    for(int i=0;i<sba.size();i++){
        Log.i("SparseBoolaeanArray","Element "+sba.keyAt(i)+":status::"+sba.get(sba.keyAt(i)));

答案 1 :(得分:0)

如果要循环选定的行

int len = listView.getCount();
SparseBooleanArray checked = listView.getCheckedItemPositions();
for (int i = 0; i < len; i++)
 if (checked.get(i)) {    
  /* do whatever you want with the checked item */
 }

您将在此主题中找到此答案:How to get Selected items from Multi Select List View

答案 2 :(得分:0)

对我来说,checked.size()总是返回0并且值最初达到12但是具有正确的键/值对。因此,我只是使用ListView的getCount来获取迭代的限制,并在遇到IndexOutOfBoudsException时完成。虽然很丑,但到目前为止它仍有效。

SparseBooleanArray checked = this.list.getCheckedItemPositions();
            ArrayList<String> ids = new ArrayList<String>();

            try {
                for (int i = 0; i < this.list.getCount(); i++){
                    if (checked.valueAt(i)){                        
                        Object r = this.list.getItemAtPosition(checked.keyAt(i));
                        ids.add(r.getId());                 
                    }               
                }
            } catch (IndexOutOfBoundsException e) {
                Log.e(TAG, e.getMessage(),e);
            }

答案 3 :(得分:0)

您可以通过将sparsebooleanarray转换为toString然后将其拆分为“,”来获取sparsebooleanarray的大小。但是让我告诉你,这不是一个非常值得信赖的方法,从目前为止我所知道的,起初它只获得检查的项目,它存储:{0=true, 1=true, 2=true}但是假设你以某种方式保存了它的状态(使用共享的pref)等等,然后取消选中已选中的项目,然后返回, {0=true, 1=true, 2=false},ie, this time the size of the array will be 3 even when true state is only carried by 2. 所以在依赖sparsebooleanarray的大小时要小心,即使它返回一个计数。