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

Как получить все отмеченные элементы из ListView?

У меня есть пара вопросов, которые мне не удалось выяснить.

Я пытаюсь получить все проверенные элементы из ListView, но:

  • Если я проверил, а затем снимет флажок с элемента, он будет возвращен как "проверен" функцией getCheckedItemPositions()

  • Я не знаю, как я могу повторить это:

    SparseBooleanArray checked = list.getCheckedItemPositions();
    
4b9b3361

Ответ 1

Я решил свой случай с этим:

public class MyAdapter extends BaseAdapter{
    public HashMap<String,String> checked = new HashMap<String,String>();
....
    public void setCheckedItem(int item) {


        if (checked.containsKey(String.valueOf(item))){
            checked.remove(String.valueOf(item));
        }

        else {
            checked.put(String.valueOf(item), String.valueOf(item));
        }
    }
        public HashMap<String, String> getCheckedItems(){
        return checked;
    }
}

Для установки элемента отмечен:

public class FileBrowser extends Activity implements OnClickListener{        
private ListView list;

    ...
    list.setOnItemClickListener(new OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int item,
                long id) {

                        BrowserAdapter bla = (BrowserAdapter) parent.getAdapter();
                        bla.setCheckedItem(item);
                    }
    });

Затем, чтобы получить проверенные элементы извне класса.

MyAdapter bAdapter;    
Iterator<String> it = bAdapter.getCheckedItems().values().iterator();
                    for (int i=0;i<bAdapter.getCheckedItems().size();i++){
                        //Do whatever
                        bAdapter.getItem(Integer.parseInt(it.next());
                    }

Надеюсь, это может помочь кому-то.

Ответ 2

Другие ответы с использованием SparseBooleanArray почти правильны, но им не хватает одной важной вещи: SparseBooleanArray.size() иногда возвращает только число значений true. Правильная реализация, которая выполняет итерации по всем элементам списка, такова:

SparseBooleanArray checked = list.getCheckedItemPositions();

for (int i = 0; i < list.getAdapter().getCount(); i++) {
    if (checked.get(i)) {
        // Do something
    }
}

Ответ 3

Ответ Jarett велик, но это должно быть немного быстрее, поскольку он проверяет только элементы в разреженном массиве, которые присутствуют в базовом массиве (только те могут быть истинными):

SparseBooleanArray checkedItemPositions = listView.getCheckedItemPositions();
    final int checkedItemCount = checkedItemPositions.size();
    for (int i = 0; i < checkedItemCount; i++) {
        int key = checkedItemPositions.keyAt(i);
        if (checkedItemPositions.get(key)) {
            doSomething(key);
        } else {
            // item was in the sparse array, but not checked.
        }
    }

Pro tip: посмотрите на источник SparseBooleanArray, это довольно простой класс:

http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.0.3_r1/android/util/SparseBooleanArray.java/?v=source

Ответ 4

Вы можете выполнять итерацию через SparseBooleanArray с использованием циклов for и методов SparseBooleanArray size() и get (index).

РЕДАКТИРОВАТЬ 3/2/2014: Люди указали, что метод SparseBooleanArray size() возвращает количество проверенных значений, а не истинную длину массива, поэтому я исправил свой ответ на эту учетную запись. По сути, это то же самое, за исключением того, что вместо того, чтобы повторять длину массива, мы повторяем его, пока не найдем все отмеченные элементы. Поскольку мы заботимся только о количестве проверенных элементов, это не имеет никакого отношения к этому методу, мы не можем фактически дойти до конца массива (мы не увидим ничего за прошлым отмеченным элементом).

SparseBooleanArray checked = list.getCheckedItemPositions();

int numChecked = checked.size();

for (int i = 0; numChecked > 0; i++){
    if (checked.get(i)){
        //the item at index i is checked, do something
        numChecked--; //We found a checked item, so decrement the number of checked items remaining
    }
    else
        //the item is not checked, do something else
}

Ответ 5

Моему мозгу не нравилось перемещаться по SparseBooleanArray, и мне не нужен пользовательский адаптер, поэтому следующее было немного более интуитивно понятным для меня:

  • Не забудьте использовать CHOICE_MODE_MULTIPLE в onCreate():

    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

  • Используйте следующий метод для получения ArrayList из них:

    // This example is to get an ArrayList of names (Strings)
    protected ArrayList<String> getNames() {
        ArrayList<String> names = new ArrayList<String>();
    
        for (int i = 0; i < getListView().getCount(); i++) {
            if (getListView().isItemChecked(i)) {
                // Do whatever you need to in here to get data from
                // the item at index i in the ListView
                names.add(mUsers.get(i).getName());
            }
        }
    
        return names;
    } 
    

Ответ 6

Просто увидел вопрос, и я столкнулся с той же проблемой.

Существует более простое решение, использующее SparseBooleanArray для точного подсчета количества элементов. Это моя процедура onClick:

@Override
public void onClick(View v) {
switch(v.getId()) {
  case R.id.button:
    SparseBooleanArray a = listView.getCheckedItemPositions();
    if(checked(vArray)>0) {
            String vCheckedList = "";
            for (int i = 0; i < nLength; i++) {
                if (a.valueAt(i) && i < nLength-1 && a.size()>1)
                    vCheckedList += listView.getAdapter().getItem(vArray.keyAt(i))+"\n";
                else if (a.valueAt(i))
                    vCheckedList += listView.getAdapter().getItem(vArray.keyAt(i));
            }
            Toast.makeText(getApplicationContext(), vCheckedList+ " is checked", Toast.LENGTH_SHORT).show(); 
            a.clear();
        } else
            Toast.makeText(getApplicationContext(), "No Item is Selected", Toast.LENGTH_SHORT).show();
        break;
    default:
        break;
        }
}

Проверенный метод:

private int checked(SparseBooleanArray vArray) {
    int vCounter = 0;
    for(int i=0;i<vArray.size(); i++)
        if(vArray.valueAt(i))
            vCounter++;
    return vCounter;

}

Он решает обе проблемы с проверенными элементами.

Ответ 7

 final long[] checkedIds = lv.getCheckItemIds();
            for (int i = 0; i < checkedIds.length; i++) {
                Log.d("checkedIds", "id checked: " + checkedIds[i]);
            }

Ответ 8

У меня была такая же проблема, и вот мое решение с SparseBooleanArray:

SparseBooleanArray checkedPositions = lv.getCheckedItemPositions ();
int size = checkedPositions.size ();
for (int i=0 ; i<size ; i++) {
     // We get the key stored at the index 'i'
     int key = checkedPositions.keyAt (i);
     // We get the boolean value with the key
     Log.i (Tag, "checkedPositions(" + key + ")=" + checkedPositions.get (key));
}

Ответ 9

В целом это решение, которое я использовал.

Где pos - позиция позиции Recyclerview

SparseBooleanArray selected = new SparseBooleanArray();

//OnClick listener here or whatever you use to check or uncheck an item
if (selected.get(pos, false)) {
        selected.delete(pos);
    } else {
        selected.put(pos, true);
    }

selected.size() покажет, сколько элементов выбрано

selected.get(pos) вернет true, если он выбрал

Следующее, как было указано, выполняет итерацию по всем тем элементам, которые были выбраны:

for (int i = 0; i < list.getAdapter().getCount(); i++) {
    if (selected.get(pos)) {
        // Do stuff
    }
}

Ответ 10

Я пробовал флажок onClickListner с условием, но он не работал должным образом. Поэтому я пробовал checkbox onClickChangedListner. Фактически я использую это для получения контакта и для множественного выбора контакта и должен сделать hashmap, поскольку я только получаю позицию строки. Поэтому я собираю позицию в строке и сопоставляю свой хэш файл с именем контакта, номером телефона и собираем его. Вы можете попробовать это.

        contact_check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked) {
                ContactPOJO contactPOJO1 = contactPOJOHashMap.get(pos);
                contactPOJO1.setIsChecked(true);
                contactPOJOHashMap.put(pos, contactPOJO1);
                checklist.add(pos);
            } else if (!isChecked) {
                ContactPOJO contactPOJO1 = contactPOJOHashMap.get(pos);
                contactPOJO1.setIsChecked(false);
                contactPOJOHashMap.put(pos, contactPOJO1);
                checklist.remove(Integer.valueOf(pos));
            }
        }
    });

    if (checklist2 != null) {
        int pos1 = 0;
        for (int i = 0; i < checklist2.size(); i++) {
            System.out.println(checklist2.get(i)); //prints element i
            pos1 = checklist2.get(i);
        }