如何从ListView获取所有选中的项目?

ser*_*rgi 41 checkbox android listview

我有几个问题我无法弄明白.

我试图从a获取所有已检查的元素ListView但是:

  1. 如果我检查然后取消选中一个元素,它将被该getCheckedItemPositions()函数"检查"返回

  2. 我不知道如何迭代这个:

    SparseBooleanArray checked = list.getCheckedItemPositions();
    
    Run Code Online (Sandbox Code Playgroud)

Jar*_*ard 75

使用的其他答案SparseBooleanArray几乎是正确的,但它们缺少一个重要的事情:SparseBooleanArray.size()有时只会返回true值的计数.迭代列表中所有项目的正确实现是:

SparseBooleanArray checked = list.getCheckedItemPositions();

for (int i = 0; i < list.getAdapter().getCount(); i++) {
    if (checked.get(i)) {
        // Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 具有讽刺意味的是,这是唯一正确(和理智)的答案,没有一票. (7认同)
  • 实际上我遇到了一个问题而且**只有**这个答案是正确的.我有一个最多10个复选框的列表.如果检查了最后两个,'getCheckedItemPositions()'将返回整个列表,但如果我要求大小,它将返回2,因为只检查了2个项目,并且只迭代前两个项目,从未到达检查过的.只有从Jare​​tt演示的ListAdapter中获取大小,我才能遍历整个列表.这应该标记为正确的答案. (2认同)

ser*_*rgi 11

我用这个解决了我的情况:

public class MyAdapter extends BaseAdapter{
    public HashMap<String,String> checked = new HashMap<String,String>();
....
    public void setCheckedItem(int item) {


        if (checked.containsKey(String.valueOf(item))){
            checked.remove(String.valueOf(item));
        }

        else {
            checked.put(String.valueOf(item), String.valueOf(item));
        }
    }
        public HashMap<String, String> getCheckedItems(){
        return checked;
    }
}
Run Code Online (Sandbox Code Playgroud)

要检查设置元素:

public class FileBrowser extends Activity implements OnClickListener{        
private ListView list;

    ...
    list.setOnItemClickListener(new OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int item,
                long id) {

                        BrowserAdapter bla = (BrowserAdapter) parent.getAdapter();
                        bla.setCheckedItem(item);
                    }
    });
Run Code Online (Sandbox Code Playgroud)

然后从课外获得检查项目..

MyAdapter bAdapter;    
Iterator<String> it = bAdapter.getCheckedItems().values().iterator();
                    for (int i=0;i<bAdapter.getCheckedItems().size();i++){
                        //Do whatever
                        bAdapter.getItem(Integer.parseInt(it.next());
                    }
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助某人.


tre*_*ere 8

Jarett的答案很棒,但这应该快一些,因为它只检查稀疏数组中存在于底层数组中的元素(只有那些才是真的):

SparseBooleanArray checkedItemPositions = listView.getCheckedItemPositions();
    final int checkedItemCount = checkedItemPositions.size();
    for (int i = 0; i < checkedItemCount; i++) {
        int key = checkedItemPositions.keyAt(i);
        if (checkedItemPositions.get(key)) {
            doSomething(key);
        } else {
            // item was in the sparse array, but not checked.
        }
    }
Run Code Online (Sandbox Code Playgroud)

专业提示:看看SparseBooleanArray的来源,这是一个非常简单的类:

http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.0.3_r1/android/util/SparseBooleanArray.java/?v=source


Chr*_*ris 6

您可以使用for循环和SparseBooleanArray的size()和get(index)方法遍历SparseBooleanArray.

编辑2014年2月2日:人们已经指出SparseBooleanArray的size()方法返回已检查值的数量,而不是数组的真实长度,因此我已经修改了我的答案.本质上它是相同的,除了不是迭代数组的长度,我们迭代,直到我们找到所有检查的项目.由于我们只关心已检查项目的数量,因此使用此方法实际上我们可能无法到达数组的末尾(我们将看不到最后一个检查项目的任何内容).

SparseBooleanArray checked = list.getCheckedItemPositions();

int numChecked = checked.size();

for (int i = 0; numChecked > 0; i++){
    if (checked.get(i)){
        //the item at index i is checked, do something
        numChecked--; //We found a checked item, so decrement the number of checked items remaining
    }
    else
        //the item is not checked, do something else
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是`ListView.getCheckedItemPositions()`返回的`SparseBooleanArray`的大小只会等于检查项的数量.未选中的项目不会显示在`SparseBooleanArray`中. (3认同)

Ben*_*ben 5

我的大脑不喜欢在SparseBooleanArray中循环,我不需要自定义适配器,所以以下对我来说更直观:

  1. 不要忘记在onCreate()中使用CHOICE_MODE_MULTIPLE:

    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

  2. 使用以下方法获取它们的ArrayList:

    // This example is to get an ArrayList of names (Strings)
    protected ArrayList<String> getNames() {
        ArrayList<String> names = new ArrayList<String>();
    
        for (int i = 0; i < getListView().getCount(); i++) {
            if (getListView().isItemChecked(i)) {
                // Do whatever you need to in here to get data from
                // the item at index i in the ListView
                names.add(mUsers.get(i).getName());
            }
        }
    
        return names;
    } 
    
    Run Code Online (Sandbox Code Playgroud)

  • 太棒了.没有理由为什么有人应该进入SparseBooleanArray的地狱洞. (2认同)