Как получить выбранные элементы из списка выбора нескольких элементов - PullRequest
46 голосов
/ 04 января 2011

Я использую адаптер массива, и к этому добавляю список массивов строки s, список является множественным выбором, Как я могу получить значения элементов списка, по которым щелкнули?чтобы сделать это,

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

Ответы [ 12 ]

43 голосов
/ 22 декабря 2011

Этот 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);
    }
}
43 голосов
/ 04 января 2011

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 */
 }
17 голосов
/ 13 сентября 2012

Я считаю, что самый быстрый способ получить информацию из этого SparseArray - это перебирать ключи (на самом деле я вполне уверен, что приведенные выше решения не будут работать во всех случаях). ListView введет пару (index, true) в 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 голосов
/ 04 декабря 2011

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

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 - это массив с тем же размером списка, содержащий идентификаторы элементов в представлении списка

3 голосов
/ 26 января 2016

Как и многие другие вещи, множественный выбор ListView с представляет собой реальную проблему в Android.

Вместо того, чтобы просто запрашивать выбранные элементы как List из 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-интерфейсами неудивительно, что разработчики злятся!

3 голосов
/ 27 сентября 2012

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

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

  • 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));
                        }
                    }
    
1 голос
/ 28 августа 2017

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

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());
                    }
                }
            });
1 голос
/ 20 августа 2016

Мы используем это в нашем классе утилит 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;
}
1 голос
/ 30 января 2015

К вашему сведению, вот как 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;
}
1 голос
/ 24 мая 2013
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
}

пара вещей, чтобы понять

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

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

Итак, когда:

i == 0, затем keyAt (i) == 4

i == 1, затем keyAt (i) == 7

i == 0 ИЛИ i == 1, затем valueAt (i) == true И получить (i) == true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...