Search code examples
androidandroid-alertdialogmultichoiceitems

How Do I Control on MultiChoice AlertDialog


I am using Dialog in my app to allow user to make multiple selection, Here is my code:

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Build an AlertDialog
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

            // String array for alert dialog multi choice items
            String[] colors = new String[]{
                    "Red",
                    "Green",
                    "Blue",
                    "Purple",
                    "Olive"
            };

            // Boolean array for initial selected items
            final boolean[] checkedColors = new boolean[]{
                    false, // Red
                    false, // Green
                    false, // Blue
                    false, // Purple
                    false // Olive

            };

            // Convert the color array to list
            final List<String> colorsList = Arrays.asList(colors);

            // Set multiple choice items for alert dialog

            builder.setMultiChoiceItems(colors, checkedColors, new DialogInterface.OnMultiChoiceClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which, boolean isChecked) {

                    // Update the current focused item's checked status
                    checkedColors[which] = isChecked;

                    // Get the current focused item
                    String currentItem = colorsList.get(which);

                    // Notify the current action
                    Toast.makeText(getApplicationContext(),
                            currentItem + " " + isChecked, Toast.LENGTH_SHORT).show();
                }
            });

            // Specify the dialog is not cancelable
            builder.setCancelable(false);

            // Set a title for alert dialog
            builder.setTitle("Your preferred colors?");

            // Set the positive/yes button click listener
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // Do something when click positive button
                    tv.setText("Your preferred colors..... \n");
                    for (int i = 0; i<checkedColors.length; i++){
                        boolean checked = checkedColors[i];
                        if (checked) {
                            tv.setText(tv.getText() + colorsList.get(i) + ", ");
                        }
                    }
                }
            });

            // Set the negative/no button click listener
            builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // Do something when click the negative button
                }
            });

            // Set the neutral/cancel button click listener
            builder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // Do something when click the neutral button
                }
            });

            AlertDialog dialog = builder.create();
            // Display the alert dialog on interface
            dialog.show();
        }
    });

And I have two queries:

  1. Like I have selected Red and Purple

    (then in TextView getting output like this: Red, Purple,)

    First of all I would like to remove comma (which getting with last value)

  2. I already selected Red and Purple, when i again open dialog not getting red and purple as selected by default (How can i save the state)enter code here, and as a result, when i am again selecting these (Red and Purple) two items, getting each item twice in a TextView


Solution

  • Try updating your textview after the loop

    And if your loop iteration reaches the length of the checkedcolors then donot append a comma.

    public void onClick(DialogInterface dialog, int which) {
            // Do something when click positive button
            tv.setText("Your preferred colors..... \n");
            for (int i = 0; i < checkedColors.length; i++) {
                boolean checked = checkedColors[i];
                String colors = "";
                if (checked) {
                    colors = colors + colorsList.get(i) ;
                    if (i != checkedColors.length - 1) {
                        colors = colors + ", ";
                    }
                }
            }
            tv.setText(tv.getText() + colors);
        }
    

    Yor textview will be updated only once, so you wont be getting each item twice in the TextView.

    For saving the state you have to use SharedPreference.

    For saving into preference use this

           SharedPreferences preferences = mContext.getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE);
    
            SharedPreferences.Editor editor = preferences.edit();
            editor.putBoolean("yourColor",isChecked);
            editor.commit();
    

    And to retrieve

            boolean isChecked = preferences.getBoolean("yourColor");