如何从ListView中获取所有选中的项目?
我有几个问题,我一直无法弄清楚。
我试图从ListView
获取所有选中的元素,但是:
-
如果我检查,然后取消选中一个元素,它将被
getCheckedItemPositions()
函数“检查”返回 -
我不知道我怎么可以迭代通过这个:
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的来源,这是一个非常简单的类:
我的大脑不喜欢循环通过SparseBooleanArray,我不需要一个自定义的适配器,所以下面是更直观的我:
-
不要忘记在onCreate()中使用CHOICE_MODE_MULTIPLE:
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
-
使用以下方法获取它们的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); }