Подтвердить что ты не робот

Как получить выбранные элементы из списка Multi Select List

Я использую адаптер массива, и к этому я добавляю список массивов строки 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) - это список массивов, как получить выбранные элементы?

4b9b3361

Ответ 1

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 */
 }

Ответ 2

Этот API беспорядок. Вот что работает для меня.

SparseBooleanArray checked = tags.getCheckedItemPositions();
for (int i = 0; i < checked.size(); i++) {
    if(checked.valueAt(i) == true) {
        Tag tag = (Tag) tags.getItemAtPosition(checked.keyAt(i));
        Log.i("xxxx", i + " " + tag);
    }
}

Ответ 3

Я считаю, что самый быстрый способ получить информацию из этого SparseArray - это перебирать ключи (на самом деле я уверен, что вышеприведенные решения не будут работать во всех случаях). ListView вводит пару (индекс, истину) в SparseBooleanArray для каждого выбранного индекса.

Таким образом, код может выглядеть так:

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);
}

Ответ 4

Я думаю, что ответ Дарена Роббинса неверен, вот мой ответ:

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)));
}

Предположим, что идентификаторы - это arraylist с тем же размером списка, что и идентификаторы элементов в представлении списка

Ответ 5

Дело в том, что вы должны перебирать все элементы списка, но не проверять их.

Определите переменные:

  • 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));
                        }
                    }
    

Ответ 6

Как и многие другие, multi-select ListView - настоящая проблема в Android.

Вместо простого запроса выбранных элементов как List of Object (дорогой Google, это то, что мы ожидаем):

List selected_items = my_list_view.getSelectedItems();

мы вынуждены использовать этот невероятно смешной API:

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() на ListView. Но вместо того, чтобы возвращать позиции каждого выбранного/отмеченного элемента в списке, он возвращает позицию каждого элемента в списке, который был затронут, независимо от того, выбран ли он в настоящий момент или нет! Невероятно, но правда.

Чтобы вычислить, действительно ли элемент проверен ТОЛЬКО В ТЕКУЩЕМ, мы вынуждены тестировать valueAt(i) для правдоподобия, в то время как цикл элементов "когда-либо был затронут".

В дополнение к этому безумию, если мы хотим рассчитать количество выбранных элементов, нам кажется, что мы вынуждены увеличивать собственный счетчик (например, num_selected).

С такими API, как этот, мало кто задумывается над разработчиками - это гнев!

Ответ 7

КАК Я РЕШЕН НОМЕР со вторым ArrayList:

  • Создан второй экземпляр ArrayList
  • Обновлен экземпляр ArrayList с элементами UNCHECKED.
  • добавил его в мой список

    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

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
}

Несколько вещей, чтобы понять

  • Это список пар ключ-значение.
  • Клавиша - это индекс строки, получить ее с помощью position.keyAt(i)
  • Значение : проверяется ли строка в этом индексе или нет (true или false), получить ее с помощью position.valueAt(i)
  • position.get(i) возвращает тот же логический как .valueAt(i)
  • Осторожно не смешивать индексы. Вы не должны (и не должны) перебирать весь список. Используйте int я для итерации по позициям, но не используйте я для получения объектов из вашего списка.
  • Но в этом конкретном случае (listView.getCheckedPositions()) он заполняет только истинные (отмеченные строки), поэтому вам действительно не нужно проверять использование .get(i) и .valueAt(i)

Пример: Скажем, вы проверили 5-й и 8-й позиции в списке (индексы 4 и 7), затем position.size() == 2 и я будет 0, а затем 1

Итак, когда:

i == 0, тогда keyAt (i) == 4

i == 1, тогда keyAt (i) == 7

i == 0 ИЛИ я == 1, тогда valueAt (i) == true AND get (i) == true

Ответ 9

Мы используем это в нашем служебном классе 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;
}

Ответ 10

Очень просто, используйте ниже код

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());
                    }
                }
            });

Ответ 11

Я думаю, еще один вариант - просто следить за всем этим.

    list.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> listView, View selectedItem,
                int position, long itemId) {
            //Keep a reference here, and toggle a global variable.

Ответ 12

FYI. Вот как это сделал Google:

Выдержка из 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;
}