Возврат значений из множественного выбора ListView - PullRequest
10 голосов
/ 12 августа 2010

Редактировать: Хорошо, я нашел решение.Не знаю, что это правильное решение, но оно работает правильно.Добавлен в код ниже.

Я пытаюсь разрешить пользователю выбирать количество каталогов из контрольного списка и возвращать их после нажатия кнопки «Отправить».Вот фрагмент моего кода.Он заполняет ListView всеми каталогами в / sdcard /, и для первоначального выбора (из всех, которые я выбираю), когда я отправляю, в журнале отображаются правильные возвращенные варианты.Однако, если я снимаю отметку с элемента и снова нажимаю «Отправить», он все равно показывает, как будто все выбраны.Нужно ли писать обработчик, чтобы снять отметку с элемента?Я думал, что позаботился о выборе выбора режима?Спасибо!

private SparseBooleanArray a;    
directoryList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, directoryArray));
    submitButton = (Button)findViewById(R.id.submit_button);
    submitButton.setOnClickListener(new OnClickListener()
        {
        @Override
        public void onClick(View v)
        {
            a = new SparseBooleanArray();
            a.clear();
            a = directoryList.getCheckedItemPositions();

            for (int i = 0; i < a.size(); i++)
            {
                //added if statement to check for true. The SparseBooleanArray
                //seems to maintain the keys for the checked items, but it sets
                //the value to false. Adding a boolean check returns the correct result.                    
                if(a.valueAt(i) == true)
                    Log.v("Returned ", directoryArray[a.keyAt(i)]);

            }                
        }
    });

Ответы [ 4 ]

4 голосов
/ 12 октября 2011

Я знаю, что вы нашли решение, которое работает для вас, но более чистое и простое решение, которое, вероятно, будет работать большую часть времени, заключается в следующем (я хочу сохранить все идентификаторы выбранных элементов):

(в моем ListActivity):

SparseBooleanArray selectedPos = getListView()
        .getCheckedItemPositions();

ListAdapter lAdapter = getListAdapter();
List<Long> ids = new ArrayList<Long>();
for (int i = 0; i < lAdapter.getCount(); i++) {
    if (selectedPos.get(i)) {
        ids.add(lAdapter.getItemId(i));
    }
}
3 голосов
/ 13 августа 2010

Сделал еще несколько отладок и нашел решение, которое сработало для меня.Отредактировано в коде выше.По какой-то причине SparseBooleanArray не очищает себя сам;он поддерживает ключи ящиков, которые были отмечены.Однако когда вызывается getCheckedItemPositions (), он устанавливает значение VALUE в значение false.Таким образом, ключ все еще находится в возвращаемом массиве, но имеет значение false.Только отмеченные флажки будут отмечены со значением true.

1 голос
/ 08 декабря 2011

Не нужно использовать SparseBooleanArray choices = parent.getCheckedItemPositions();

StringBuilder достаточно для этого.

1 голос
/ 07 декабря 2010

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

public class NaughtyAndNice extends ListActivity {
TextView selection;
String[] items={"lorem","ipsum", "dolor", "sit", "amet",
        "consectetuer", "adipisc", "jklfe", "morbi", "vel",
        "ligula", "vitae", "carcu", "aliequet"};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,items));
           selection = (TextView)findViewById(R.id.selection);
    this.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}

public void onListItemClick(ListView parent, View view, int position, long id){
    SparseBooleanArray choices = parent.getCheckedItemPositions();
    StringBuilder choicesString = new StringBuilder();
    for (int i = 0; i < choices.size(); i++)
    {
    //added if statement to check for true. The SparseBooleanArray
    //seems to maintain the keys for the checked items, but it sets
    //the value to false. Adding a boolean check returns the correct result.                    
        if(choices.valueAt(i) == true)
            choicesString.append(items[choices.keyAt(i)]).append(" ");

    } 
    selection.setText(choicesString);
}
}

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