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

时间:2011-01-28 18:49:22

标签: android listview checkbox

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

我正在尝试从ListView获取所有已检查的元素,但是:

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

  2. “检查”返回
  3. 我不知道如何迭代这个:

    SparseBooleanArray checked = list.getCheckedItemPositions();
    

10 个答案:

答案 0 :(得分:75)

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

SparseBooleanArray checked = list.getCheckedItemPositions();

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

答案 1 :(得分: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;
    }
}

要检查设置元素:

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

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

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());
                    }

希望它可以帮助别人。

答案 2 :(得分: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.
        }
    }

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

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

答案 3 :(得分:6)

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

EDIT 3/2/2014:人们已经指出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
}

答案 4 :(得分: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;
    } 
    

答案 5 :(得分:2)

 final long[] checkedIds = lv.getCheckItemIds();
            for (int i = 0; i < checkedIds.length; i++) {
                Log.d("checkedIds", "id checked: " + checkedIds[i]);
            }

答案 6 :(得分:1)

刚看到这个问题,我面临同样的问题。

有一个更简单的解决方案,使用SparseBooleanArray来精确计算检查的项目数。 这是我的onClick程序:

@Override
public void onClick(View v) {
switch(v.getId()) {
  case R.id.button:
    SparseBooleanArray a = listView.getCheckedItemPositions();
    if(checked(vArray)>0) {
            String vCheckedList = "";
            for (int i = 0; i < nLength; i++) {
                if (a.valueAt(i) && i < nLength-1 && a.size()>1)
                    vCheckedList += listView.getAdapter().getItem(vArray.keyAt(i))+"\n";
                else if (a.valueAt(i))
                    vCheckedList += listView.getAdapter().getItem(vArray.keyAt(i));
            }
            Toast.makeText(getApplicationContext(), vCheckedList+ " is checked", Toast.LENGTH_SHORT).show(); 
            a.clear();
        } else
            Toast.makeText(getApplicationContext(), "No Item is Selected", Toast.LENGTH_SHORT).show();
        break;
    default:
        break;
        }
}

检查方法:

private int checked(SparseBooleanArray vArray) {
    int vCounter = 0;
    for(int i=0;i<vArray.size(); i++)
        if(vArray.valueAt(i))
            vCounter++;
    return vCounter;

}

它将解决已检查项目的两个问题。

答案 7 :(得分:1)

我遇到了同样的问题,这是我的解决方案SparseBooleanArray

SparseBooleanArray checkedPositions = lv.getCheckedItemPositions ();
int size = checkedPositions.size ();
for (int i=0 ; i<size ; i++) {
     // We get the key stored at the index 'i'
     int key = checkedPositions.keyAt (i);
     // We get the boolean value with the key
     Log.i (Tag, "checkedPositions(" + key + ")=" + checkedPositions.get (key));
}

答案 8 :(得分:0)

总而言之,这是我使用的解决方案。

其中pos是Recyclerview项目位置

SparseBooleanArray selected = new SparseBooleanArray();

//OnClick listener here or whatever you use to check or uncheck an item
if (selected.get(pos, false)) {
        selected.delete(pos);
    } else {
        selected.put(pos, true);
    }

selected.size()将显示已选择的项目数

selected.get(pos)如果已选中则会返回

如上所述,迭代所有选定的项目:

for (int i = 0; i < list.getAdapter().getCount(); i++) {
    if (selected.get(pos)) {
        // Do stuff
    }
}

答案 9 :(得分:0)

这是我如何从 recyclerview 适配器获取检查项目

fun getAllCheckedItems(outList){
         for (position in spareBooleanArray.keyIterator()) {
            outList.add(mList.get(position)
        }
}