如何从多选列表视图中获取所选项目

时间:2011-01-04 05:15:32

标签: android android-listview

我正在使用一个数组适配器,并且为此添加了一个字符串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)是一个数组列表,那么如何检索所选项呢?

13 个答案:

答案 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。

定义变量:

  • listView(ListView的实例)
  • 名称(您是ArrayList)
  • 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解决问题:

  1. 创建了第二个ArrayList实例
  2. 使用UNCHECKED项目
  3. 更新了该ArrayList实例
  4. 将其添加到我的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);}
    
  5. 希望它会有所帮助:)

答案 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
}

要理解的几件事

  • 这是一个键值对列表。
  • 是一行的索引,使用positions.keyAt(i)获取它
  • 是指是否检查该索引处的行(true或false),使用positions.valueAt(i)获取它
  • positions.get(i)返回相同的布尔值.valueAt(i)
  • 小心不要让索引混乱。您需要(且不应该)遍历整个列表。使用int i迭代位置,但不要使用i从列表中获取对象
  • 但是在这个特定情况下(listView.getCheckedPositions())它只填写true(已检查的行),因此您实际上不需要使用.get(i)和.valueAt(i)验证

实施例: 假设你已经检查了列表中的第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)

仅供参考,谷歌是这样做的:

摘自http://mytracks.googlecode.com/hg/MyTracks/src/com/google/android/apps/mytracks/util/Api11Adapter.java

/**
* 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()方法之后使用