Multiple choice AlertDialog with custom Adapter
android, android-alertdialog, android-arrayadapter, multiple-choice
Solution
Unfortunately, there doesn't seem to be an easy way to toggle on AlertDialog's multichoicemode without calling `setMultiChoiceItems()`.
However, you can set an adapter, then turn on multichoice mode in the contained `ListView` itself.
final AlertDialog dialog = new AlertDialog.Builder(getActivity())
.setTitle("Title")
.setAdapter(yourAdapter, null)
.setPositiveButton(getResources().getString(R.string.positive), null)
.setNegativeButton(getResources().getString(android.R.string.cancel), null)
.create();
dialog.getListView().setItemsCanFocus(false);
dialog.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
dialog.getListView().setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// Manage selected items here
System.out.println("clicked" + position);
CheckedTextView textView = (CheckedTextView) view;
if(textView.isChecked()) {
} else {
}
}
});
dialog.show();
Problem
I am trying to create a AlertDialog with multiple choice option. I have tried with the `setMultiChoiceItems` but what i have is a `ArrayList<Category>` and not a `CharSequence` so i tried with the adapter. The problem with `setAdapter` is that when i select one item it closes the dialog window. And what i want is to select the items and then hit the OK button to see what items where selected. ``` AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Pick a color"); ArrayAdapter<Category> catsAdapter = new ArrayAdapter<Category>(this, android.R.layout.select_dialog_multichoice,this.categories); builder.setAdapter(catsAdapter, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { } }); builder.setPositiveButton("Save", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //do something } });; AlertDialog alert = builder.create(); alert.show(); ```