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