Search code examples
androidadapterandroid-alertdialogmultiple-choice

Multiple choice alert dialog with custom row layout


I need to create an AlertDialog with multiple choice items but I'm having some trouble trying to set a custom layout file to the internal ListView.

For single choice items I use a constructor that takes a ListAdapter as parameter and this way I can set the proper layout resource for each row:

        builder.setSingleChoiceItems(new ArrayAdapter<String>(getActivity(),
                R.layout.list_item_single_choice_answer, items), checkedItem,
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        checkedItem = which;
                        toggleEditTextAnswer(checkedItem == (items.length - 1));
                        dialog.dismiss();
                    }
                });

The problem is that there's no constructor for setMultiChoiceItems that accepts a ListAdapter as parameter when creating a multiple choice list.

I need to set a custom layout for each row because I use drawable selectors for setting the row background and text color.

Any ideas?

PS. here is the AlertDialog source code for more information. https://android.googlesource.com/platform/frameworks/base.git/+/android-4.2.2_r1/core/java/android/app/AlertDialog.java


Solution

  • Well, I know I should create a custom Dialog but right now I don't have the time to do it ... so this is how I hacked this problem:

            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            // Set the adapter
            builder.setAdapter(
                    new ArrayAdapter<String>(getActivity(),
                            R.layout.list_item_multiple_choice_answer, items), null)
            // Set the action buttons
                    .setPositiveButton(android.R.string.ok,
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int id) {
                                    dialog.dismiss();
                                }
                            });
    
            AlertDialog alertDialog = builder.create();
    
            ListView listView = alertDialog.getListView();
            listView.setAdapter(new ArrayAdapter<String>(getActivity(),
                    R.layout.list_item_multiple_choice_answer, items));
            listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    CheckedTextView checkedTextView = (CheckedTextView) view;
                    checkedItems[position] = !checkedTextView.isChecked();
                }
            });
            listView.setDivider(null);
            listView.setDividerHeight(-1);
    
            alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
    
                @Override
                public void onShow(DialogInterface dialog) {
                    setCheckedItems(((AlertDialog) dialog).getListView());
                }
            });
    
            alertDialog.show();
    

    First I set the adapter with the items and the instead of calling setMultiChoiceItems I get the ListView object from the Dialog and then configure it myself.