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

我有几个问题,我一直无法弄清楚。

我试图从ListView获取所有选中的元素,但是:

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

  2. 我不知道我怎么可以迭代通过这个:

     SparseBooleanArray checked = list.getCheckedItemPositions(); 

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

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

我解决了我的情况:

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

希望它可以帮助别人。

Jarett的答案很好,但是这应该会更快一些,因为它只检查底层数组中存在的稀疏数组中的元素(只有那些元素可以是true):

 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

我的大脑不喜欢循环通过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; } 

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

编辑3/2/2014:人们指出,SparseBooleanArray的size()方法返回检查值的数量,而不是真正的数组长度,所以我已经修复了我的答案。 本质上它是相同的,除了不是迭代数组的长度,我们迭代,直到我们find所有检查的项目。 因为我们只关心被检查项目的数量,所以用这个方法是没有意义的,实际上我们可能不会到达数组的末尾(我们不会看到最后一个检查项目的任何东西)。

 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 } 

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

有一个更简单的解决scheme,使用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; } 

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

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

我有同样的问题,这是我的解决scheme与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)); } 

在这整个这是我使用的解决scheme。

哪里是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()将显示select了多less个项目

selected.get(pos)将返回true

如上所述,遍历所选的所有项目:

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

我试过checkboxonClickListner条件,但它不能正常工作。 所以我试过checkboxonClickChangedListner。 其实我正在使用这个来检索联系人和多重联系人select和必须做hashmap,因为我只是获得排的位置。 所以我收集行的位置,并与我的联系人姓名,电话号码hashmap匹配,并收集该用户。 你可以试试这个..

  contact_check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { ContactPOJO contactPOJO1 = contactPOJOHashMap.get(pos); contactPOJO1.setIsChecked(true); contactPOJOHashMap.put(pos, contactPOJO1); checklist.add(pos); } else if (!isChecked) { ContactPOJO contactPOJO1 = contactPOJOHashMap.get(pos); contactPOJO1.setIsChecked(false); contactPOJOHashMap.put(pos, contactPOJO1); checklist.remove(Integer.valueOf(pos)); } } }); if (checklist2 != null) { int pos1 = 0; for (int i = 0; i < checklist2.size(); i++) { System.out.println(checklist2.get(i)); //prints element i pos1 = checklist2.get(i); }