我正在使用一个数组适配器,并且为此添加了一个字符串s的数组列表,该列表是多选的,如何才能获得列表项的值?
my_contacts_list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice,conts_list);
my_contacts_list.setAdapter(adapter);
我试图这样做,
SparseBooleanArray positions = my_contacts_list.getCheckedItemPositions();
int size=positions.size();
int i=0;
while(i <= size){
conts_list.get(positions.get(i));
i++;
}
但是position.get(i)是一个数组列表,那么如何检索所选项呢?
答案 0 :(得分:43)
SparseBooleanArray.get返回一个布尔值,但我相信您需要检查列表中的每个位置,例如。
int len = listView.getCount();
SparseBooleanArray checked = listView.getCheckedItemPositions();
for (int i = 0; i < len; i++)
if (checked.get(i)) {
String item = cont_list.get(i);
/* do whatever you want with the checked item */
}
答案 1 :(得分:43)
这个API很乱。这对我有用。
SparseBooleanArray checked = tags.getCheckedItemPositions();
for (int i = 0; i < checked.size(); i++) {
if(checked.valueAt(i)) {
Tag tag = (Tag) tags.getItemAtPosition(checked.keyAt(i));
Log.i("xxxx", i + " " + tag);
}
}
答案 2 :(得分:17)
我认为从这个SparseArray
获取信息的最快方法是迭代密钥(实际上我很确定上述解决方案在所有情况下都不起作用)。对于每个选定的索引,ListView
都会在SparseBooleanArray
中输入一对(index,true)。
所以代码可能如下所示:
SparseBooleanArray checked = lv.getCheckedItemPositions();
int size = checked.size(); // number of name-value pairs in the array
for (int i = 0; i < size; i++) {
int key = checked.keyAt(i);
boolean value = checked.get(key);
if (value)
doSomethingWithSelectedIndex(key);
}
答案 3 :(得分:4)
我认为Daren Robbins的回答是错误的,这是我的回答:
ArrayList<String> ids = extras.getStringArrayList("commonids");
SparseBooleanArray checked = lv.getCheckedItemPositions();
for (int i = 0; i < checked.size(); i++) {
if(checked.get(i))
Log.i("CheckedItem", ids.get(checked.indexOfKey(i)));
}
假设ids是一个与列表视图大小相同的arraylist,其中包含列表视图中项目的ID
答案 4 :(得分:3)
问题是你必须迭代所有列表视图项而不是checkedPositions。
定义变量:
saveCheckedName(将所有选中的名称保存到此Arraylist)
SparseBooleanArray checkedPositions = listView.getCheckedItemPositions();
for (int i = 0; i < subjectListView.getCount(); i++) {
if (checkedPositions.get(i) == true) {
saveCheckedName.add(names.get(i));
}
}
答案 5 :(得分:3)
与其他许多内容一样,多选 public static MvcHtmlString RawActionLink(this AjaxHelper ajaxHelper, string linkText, string actionName, string controllerName, AjaxOptions ajaxOptions, object htmlAttributes)
{
var repID = Guid.NewGuid().ToString();
var lnk = ajaxHelper.ActionLink(repID, actionName, controllerName, ajaxOptions, htmlAttributes);
return MvcHtmlString.Create(lnk.ToString().Replace(repID, linkText));
}
是Android中的一个真正问题。
而不是简单地将所选项目请求为ListView
List
{亲爱的Google,这是我们所期望的):
Object
我们被迫使用这个非常荒谬的API:
List selected_items = my_list_view.getSelectedItems();
通过在SparseBooleanArray checked = my_list_view.getCheckedItemPositions();
int num_selected = 0;
for(int i = 0; i < checked.size(); i++) {
if(checked.valueAt(i)) {
num_selected++;
int key = checked.keyAt(i);
boolean value = checked.get(key);
if (value) {
//
}
}
}
上调用名字更为可怕的SparseBooleanArray
来填充名为getCheckedItemPositions()
的名字。但是,它不会返回列表中每个所选/已检查项目的位置,而是返回列表中 WAS EVER触摸的每个项目的位置,无论当前是否实际被选中!难以置信,但是真正。
要计算该项目是否实际上已经过当前检查,我们将被迫在循环查看“曾经被触及”的项目数组时测试ListView
的真实性。
除了这种疯狂之外,如果我们想要计算所选项目的数量,我们似乎被迫增加我们自己的计数器(例如valueAt(i)
)。
对于像这样的API,开发人员很生气,这也就不足为奇了!
答案 6 :(得分:1)
我认为另一个选择是自己跟踪所有这些。
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> listView, View selectedItem,
int position, long itemId) {
//Keep a reference here, and toggle a global variable.
答案 7 :(得分:1)
我如何使用第二个ArrayList解决问题:
将其添加到我的listadapter
public void removeSelectedItems(){
updatedList = new ArrayList<String>(); //initialize the second ArrayList
int count = lv.getCount(); //number of my ListView items
SparseBooleanArray checkedItemPositions = getListView().getCheckedItemPositions();
for (int i=0;i < count;i++){
if(!checkedItemPositions.get(i))
updatedList.add(liveNames.get(i)); //liveNames is the current ArrayList
Log.e("TEST", liveNames.get(i));
}
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_multiple_choice, updatedList);
setListAdapter(adapter);}
希望它会有所帮助:)
答案 8 :(得分:1)
Foo objectAtCheckedRow = null;
for (int i = 0; i < positions.size(); i++) { //positions.size() == 2
objectAtCheckedRow = adapter.getItem(positions.keyAt(i));
//Do something significant with object here
}
要理解的几件事
实施例: 假设你已经检查了列表中的第5和第8项(索引4和7),然后是positions.size()== 2,我将为0然后是1
所以当:
i == 0然后keyAt(i)== 4
i == 1然后keyAt(i)== 7
i == 0 OR i == 1 then valueAt(i)== true AND get(i)== true
答案 9 :(得分:1)
仅供参考,谷歌是这样做的:
/**
* Gets the checked positions in a list view.
*
* @param list the list view
*/
private int[] getCheckedPositions(ListView list) {
SparseBooleanArray positions = list.getCheckedItemPositions();
ArrayList<Integer> arrayList = new ArrayList<Integer>();
for (int i = 0; i < positions.size(); i++) {
int key = positions.keyAt(i);
if (positions.valueAt(i)) {
arrayList.add(key);
}
}
int[] result = new int[arrayList.size()];
for (int i = 0; i < arrayList.size(); i++) {
result[i] = arrayList.get(i);
}
return result;
}
这是我的改编版本:
public static List<Integer> getAbsListViewCheckedItemPositions(AbsListView absListView) {
SparseBooleanArray checked = absListView.getCheckedItemPositions();
List<Integer> positions = new ArrayList<>();
int checkedSize = checked.size();
for (int i = 0; i < checkedSize; i++) {
if (checked.valueAt(i)) {
positions.add(checked.keyAt(i));
}
}
return positions;
}
答案 10 :(得分:1)
我们在Android实用程序类中使用它。泛型有助于防止编译器警告,但如果适配器返回多种类型,则可以删除它们。
public static <T> Collection<T> getCheckedItems(ListView listView) {
Collection<T> ret = new ArrayList();
SparseBooleanArray checkedItemPositions = listView.getCheckedItemPositions();
for (int i = 0; i < checkedItemPositions.size(); i++) {
if (checkedItemPositions.valueAt(i)) {
T item = (T) listView.getAdapter().getItem(checkedItemPositions.keyAt(i));
ret.add(item);
}
}
return ret;
}
答案 11 :(得分:1)
非常简单,使用下面的代码
listViewRequests.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
AppCompatCheckedTextView checkBox = (AppCompatCheckedTextView) view;
if (checkBox.isChecked() == true){
Log.i("CHECK",checkBox.isChecked()+""+checkBox.getText().toString());
}
}
});
答案 12 :(得分:0)
for(int i =0; i< listView.getAdapter().getCount(); i++){
if(listView.isItemChecked(i)){
listView.getAdapter().getItem(i); // item
}
}
应在setAdapter()
方法之后使用