Множественный выбор AlertDialog с пользовательским адаптером

Я пытаюсь создать AlertDialog с несколькими вариантами выбора. Я попытался с setMultiChoiceItems но у меня есть ArrayList<Category> а не CharSequence поэтому я попытался с адаптером.

Проблема с setAdapter заключается в том, что, когда я выбираю один элемент, он закрывает диалоговое окно. И я хочу, чтобы выбрать элементы, а затем нажмите кнопку «ОК», чтобы увидеть, какие элементы выбраны.

 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(); 

К сожалению, кажется, что нет простого способа переключиться на мультихоимод AlertDialog без вызова setMultiChoiceItems() .

Однако вы можете установить адаптер, а затем включить многозадачный режим в содержащемся в списке ListView .

 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(); 

См. Ниже код, который может вам помочь. Я использовал это в своем приложении.

 public static ArrayList<String> Party_list_new = new ArrayList<String>(); ArrayList<String> party_multi_cheked = new ArrayList<String>(); public void show_alert() { final Dialog dia = new Dialog(this); dia.setContentView(R.layout.alert_); dia.setTitle("Select File to import"); dia.setCancelable(true); final ListView list_alert = (ListView) dia .findViewById(R.id.alert_list); list_alert.setAdapter(new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_multiple_choice, Party_list_new)); list_alert.setItemsCanFocus(false); list_alert.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); list_alert.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) { } }); Button btn = (Button) dia.findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { SparseBooleanArray positions = list_alert .getCheckedItemPositions(); int j = 0; for (int k = 0; k < Party_list_new.size(); k++) { if (positions.get(k)) { party_multi_cheked.add("" + k); } } dia.dismiss(); } }); dia.show(); } 

alert_list.xml

  <?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Select Party" /> <ListView android:id="@+id/alert_list" android:layout_width="match_parent" android:padding="5dp" android:layout_height="wrap_content" > </ListView> </LinearLayout> 

Сделайте это правильно, если оно будет правильным.

Это остановит диалог ur от исчезновения после одного выбора.

 AlertDialog alertDialog = builder.create(); ListView listView = alertDialog.getListView(); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub } }); 

Чтобы выбрать, какие элементы выбраны, вам необходимо соответствующим образом спланировать ваш адаптер.