Как отменить изменения в AlertDialog.Builder?

Создаю диалоговое окно с множественным выбором. Подскажите, как правильно отменить изменения выбора после нажатия на кнопку Отмена или закрытия окна? Первое, что приходит в голову - записывать все изменения в массив, а потом подгружать их в зависимости от действий пользователя (нажатие на ок или отмену). Есть ли какой-то более удобный способ?

private void showEventParticipantsDialog()
{
    String[] listItems = new String[] {"Музыкант", "Музыкальная группа", "Фотограф", "Видеограф", "Фокусник",
            "Ведущий", "Шоу", "Диджей", "Звукорежиссёр", "Декоратор"};

    AlertDialog.Builder checkBuilder = new AlertDialog.Builder(getActivity());
    checkBuilder.setTitle("Выберите участников");

    checkBuilder.setMultiChoiceItems(listItems, participantsArray, (dialogInterface, i, b) ->
            participantsArray[i] = b);

    checkBuilder.setPositiveButton("Ок", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i)
        {

        }
    });

    checkBuilder.setNegativeButton("Отмена", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i)
        {
            Log.d("SAHJASSA", "Cancel: ");
        }
    });

    checkBuilder.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialogInterface)
        {
            Log.d("SAHJASSA", "onDismiss: ");
        }
    });

    checkBuilder.create();
    checkBuilder.show();
}

Ответы (1 шт):

Автор решения: woesss

Можно не трогать массив при кликах по элементам, а применить всё разом при позитивном клике.
Соответственно никакие изменения не будут применены если диалог закрыли любым другим способом:

checkBuilder.setPositiveButton("Ок", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        SparseBooleanArray cip = ((AlertDialog) dialog).getListView().getCheckedItemPositions();
        for (int i = 0; i < cip.size(); i++) {
            int key = cip.keyAt(i);
            participantsArray[key] = cip.get(key);
        }    
    }
});

P.S. Чтобы диалог не изменял входной массив нужно передать null вместо обработчика клика по элементу. Странно что это работает именно так, а не наоборот - но что имеем, то имеем:

checkBuilder.setMultiChoiceItems(listItems, participantsArray, null);
→ Ссылка