ser*_*rgi 41 checkbox android listview
我有几个问题我无法弄明白.
我试图从a获取所有已检查的元素ListView但是:
如果我检查然后取消选中一个元素,它将被该getCheckedItemPositions()函数"检查"返回
我不知道如何迭代这个:
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)
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)
希望它可以帮助某人.
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的来源,这是一个非常简单的类:
您可以使用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)
我的大脑不喜欢在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;
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
67074 次 |
| 最近记录: |