Почему ListView.getCheckedItemPositions () не возвращает правильные значения? - PullRequest
27 голосов
/ 22 октября 2010

Приложение имеет ListView с включенным множественным выбором, в пользовательском интерфейсе оно работает как положено.Но когда я считываю значения с помощью этого кода:

Log.i(TAG,"Entered SearchActivity.saveCategoryChoice()");
SparseBooleanArray checkedPositions = categorySelector.getCheckedItemPositions();
Log.i(TAG,"checkedPositions: " + checkedPositions.size());

if (checkedPositions != null) {
  int count = categoriesAdapter.getCount();
  for ( int i=0;i<count;i++) {
    Log.i(TAG,"Selected items: " + checkedPositions.get(i));
  }
}

я получаю этот вывод, независимо от того, в каком состоянии находится каждый флажок:

Entered SearchActivity.saveCategoryChoice()
checkedPositions: 0
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false
Selected items: false

SparseBooleanArray кажется, возвращает false для любого несуществующего элемента, поэтому источником проблем, как представляется, является то, что getCheckedItemPositions () возвращает пустой массив.Метод ведет себя так, как будто в ListView нет элементов, но они есть.

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

categorySelector.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

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

Ответы [ 15 ]

0 голосов
/ 19 сентября 2012

, хотя я не верю, что попробовал все варианты, описанные здесь, вот тот, который работал для меня:)

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) 
        {

            CheckedTextView retView = (CheckedTextView) convertView;
...
            retView.setOnClickListener(new View.OnClickListener() 
            {
                public void onClick(View v)
                {
                    CheckedTextView chkVw = (CheckedTextView) v; 
//                  chkVw.toggle();
//                  chkVw.setChecked(!chkVw.isChecked());
                    mLstVwWordingSets.setItemChecked(position + 1, !chkVw.isChecked());
                }
            });
...
       }

и позже

        SparseBooleanArray checkedItemsArray = mLstVwWordingSets.getCheckedItemPositions();
        for (int i = 1; i <  mLstVwWordingSets.getCount(); i++)         //skip the header view
        {
            if (checkedItemsArray.get(i, false))
                Log.d(_TAG, "checked item: " + i);
        }

Я получаю доступ к позиции + 1 из-за представления заголовка, которое есть в моем списке.

НТН

0 голосов
/ 29 ноября 2011

Я также использовал решение, предложенное Гиллером, которое включает «инициацию» просмотра списка

ListView lv = getListView(); for (int i = 0; i < lv.getCount(); i++) { lv.setItemChecked(i, false); }

перед вызовом getCheckItemPositions (), и он перестал выдавать ошибочные результаты!

0 голосов
/ 06 февраля 2011

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

Это была фактически реализованная мною функция, где пользователь мог либо «Выбрать все»или «Отменить выбор всех».Я запускаю этот метод в моем onCreate.

private void selectNone() {
    ListView lv = getListView();
    for (int i = 0; i < lv.getCount(); i++) {
        lv.setItemChecked(i, false);
    }
}

Теперь все мои значения верны.Для получения значений, в моем случае, просто Strings.

private void importSelected() {     
    ListView lv = getListView();
    SparseBooleanArray selectedItems = lv.getCheckedItemPositions();

    for (int i = 0; i < selectedItems.size(); i++) {
        if (selectedItems.get(i)) {
            String item =  lv.getAdapter().getItem(selectedItems.keyAt(i)).toString();
        }
    }

    selectNone(); //Reset
}

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

0 голосов
/ 29 декабря 2010

Эта корректировка исправила это для меня.Измените метод getView таким образом, чтобы «int position» была «final int position».Затем сделайте это со своим флажком:

((CheckBox) convertView).setOnCheckedChangeListener(new OnCheckedChangeListener() {

                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    list.setItemChecked(position, ((CheckBox) buttonView).isChecked());
                }
            });

Позвольте мне уточнить.list является ссылкой на просмотр списка, и в моем случае адаптер является внутренним классом в диалоге, содержащем список.

0 голосов
/ 22 октября 2010

Разве нет довольно принципиальной разницы между 'selected' и 'checked'?

Подозреваю, что вы хотите setItemChecked() из OnItemSelectedListener ...

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