8

Sto tentando di creare un AlertDialog con opzione a scelta multipla. Ho provato con il setMultiChoiceItems ma quello che ho è un e non un CharSequence così ho provato con l'adattatore.AlertDialog a scelta multipla con adattatore personalizzato

Il problema con setAdapter è che quando seleziono un elemento, esso chiude la finestra di dialogo. E quello che voglio è selezionare gli oggetti e poi premere il tasto OK per vedere quali oggetti sono stati selezionati.

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

Perché non creare dinamicamente una visualizzazione personalizzata con i pulsanti di opzione popolati da ArrayList? È possibile impostare una vista personalizzata per una finestra di avviso quindi controllare manualmente le statue della scatola in setPositiveButton –

+0

Desidero il codice dell'adattatore. Puoi darmelo? – offset

risposta

0

vedere sotto codice può essere di aiuto. l'ho usato nella mia app.

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> 

fanno bene se è corretto.

+0

Non esattamente quello che voglio, perché "spezza" lo stile dell'alertDialog che ho. –

1

questo interromperà la vostra finestra di dialogo scomparendo dopo una selezione.

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 

    } 
}); 

Per ottenere gli elementi selezionati, è necessario pianificare l'adattatore di conseguenza.

26

Sfortunatamente, non sembra essere un modo semplice per attivare il multichoicemode di AlertDialog senza chiamare setMultiChoiceItems().

Tuttavia, è possibile impostare un adattatore, quindi attivare la modalità multichoice nello stesso ListView contenuto.

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