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填充的單選按鈕?您可以爲警報對話框設置自定義視圖,然後手動檢查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

這會阻止你的對話在一次選擇後消失。

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

不幸的是,似乎沒有一種簡單的方法可以在不呼叫setMultiChoiceItems()的情況下切換AlertDialog的多選模式。

但是,您可以設置一個適配器,然後在包含的ListView本身中打開multichoice模式。

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