8

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

Проблема с 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(); 
+0

Почему бы не создать динамическое создание настраиваемого вида с помощью переключателей, заполненных вашим ArrayList? Вы можете настроить пользовательский вид для диалогового окна предупреждения, а затем manaully проверить статусы окна в setPositiveButton –

+0

Я хочу код адаптера. Можете ли вы дать мне это? – offset

ответ

0

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

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> 

сделать это правильно, если это правильно.

+0

Не совсем то, что я хочу, потому что он «ломает» стиль другого AlertDialog, который у меня есть. –

1

это остановит диалог 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 

    } 
}); 

Для того, чтобы выбрать то, что выбрать, необходимо соответствующим образом спланировать свой адаптер.

26

К сожалению, не существует простого способа переключиться на мультихоимод 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(); 
Смежные вопросы