我有几个问题我无法弄明白。
我正在尝试从ListView
获取所有已检查的元素,但是:
如果我检查然后取消选中一个元素,它将被getCheckedItemPositions()
函数
我不知道如何迭代这个:
SparseBooleanArray checked = list.getCheckedItemPositions();
答案 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的来源,这是一个非常简单的类:
答案 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中循环,我不需要自定义适配器,所以以下对我来说更直观一些:
不要忘记在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;
}
答案 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)
}
}