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

Как снять отметку с элементов в AlertDialog (setMultiChoiceItems)?

Я хотел бы очистить выбранные элементы, когда общее количество выбрано для трех элементов, я делаю следующее, но не работает...

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(getResources().getText(R.string.escolhaArquivosBaixados));         
        builder.setMultiChoiceItems(items, selected, new DialogInterface.OnMultiChoiceClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                //                  
                int count = 0;                  
                for(int i = 1; i < selected.length; i++){
                    //
                    if (selected[i]){
                        count++;
                    }
                    if (count == 3){
                        //enter here but nothing happens
                        ((AlertDialog) dialog).getListView().setItemChecked(which, false);   
                        break;
                    }
                }                   
            }

        });
4b9b3361

Ответ 1

Увидев ответ Jorgesys в этом question, я понял, чего не хватает в моем коде, для изменения булевского списка тоже необходимо.

        selected[which] = false;
        ((AlertDialog) dialog).getListView().setItemChecked(which, false);

Ответ 2

Первый индекс в массиве равен 0, а не 1. Таким образом:

for(int i = 1; i < selected.length; i++){
                //
                if (selected[i]){
                    count++;
                }

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

if (count == 3){

никогда не будет истинным, потому что он будет проверять последние два в массиве. Также этот вызов:

((AlertDialog) dialog).getListView().setItemChecked(which, false); 

устанавливает только 1 элемент в списке, чтобы снять флажок. Это будет третий, который вы нажмете. Итак, первые два, которые вы нажмете, будут проверены и останутся проверенными. Затем, когда вы нажимаете на третий, он будет проверяться на долю секунды, а затем снимите флажок. Это то, что вы пытаетесь сделать? или вы хотите снять все три из них? Его не очень понятно, что вы пытаетесь сделать по своему вопросу.

Ответ 3

, если вы хотите использовать multicheckoption как единую опцию выбора, используйте этот код.

 String[] items = new String[]{"Most Funded (high - low)", "Most Funded (low - high)", "Newest first", "Funding Ask"};
boolean selected[] = new boolean[]{false, false, false, true};

private void showDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(getResources().getText(R.string.sortby));
    builder.setMultiChoiceItems(items, selected, new DialogInterface.OnMultiChoiceClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
            //
            for (int i = 0; i < selected.length; i++) {
                if (i == which) {
                    selected[i]=true;
                    ((AlertDialog) dialog).getListView().setItemChecked(i, true);
                }
                else {
                    selected[i]=false;
                    ((AlertDialog) dialog).getListView().setItemChecked(i, false);
                }
            }
        }

    });
    builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            dialogInterface.dismiss();
        }
    });
    builder.show();
}