8

Ich versuche, einen AlertDialog mit Multiple-Choice-Option zu erstellen. Ich habe mit der setMultiChoiceItems versucht, aber was ich habe, ist eine ArrayList<Category> und nicht eine CharSequence, also versuchte ich mit dem Adapter.Multiple Choice AlertDialog mit benutzerdefiniertem Adapter

Das Problem mit setAdapter ist, dass wenn ich ein Element auswähle, es das Dialogfenster schließt. Und was ich will ist, die Elemente auszuwählen und dann die OK-Taste drücken, um zu sehen, welche Elemente ausgewählt wurden.

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

Warum erstellen Sie nicht dynamisch eine benutzerdefinierte Ansicht mit Optionsfeldern, die von Ihrer ArrayList aufgefüllt werden? Sie können eine benutzerdefinierte Ansicht für einen Alarmdialog festlegen und dann die Boxstatuen in setPositiveButton überprüfen. –

+0

Ich möchte den Code des Adapters. Kannst Du es mir geben? – offset

Antwort

0

siehe unten Code kann es Ihnen helfen. Ich habe das in meiner App verwendet.

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> 

es richtig machen, wenn es richtig ist.

+0

Nicht genau was ich will, weil es den Stil des anderen AlertDialogs "bricht", den ich habe. –

1

Dies stoppt Ihren Dialog nach einer Auswahl verschwinden.

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 

    } 
}); 

Um welche Elemente ausgewählt sind, müssen Sie Ihren Adapter entsprechend planen.

26

Leider scheint es nicht eine einfache Möglichkeit zu sein, auf AlertDialogs Multichoemode ohne Aufruf von setMultiChoiceItems() umzuschalten.

Sie können jedoch einen Adapter festlegen und dann den Multichoice-Modus im enthaltenen ListView selbst aktivieren.

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