具有自定义适配器的多选AlertDialog

11

我正在尝试创建一个具有多选选项的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();

为什么不使用动态创建的自定义视图,其中包含由您的ArrayList填充的单选按钮?您可以为警报对话框设置自定义视图,然后在setPositiveButton中手动检查框状态。 - Andrew G
我想要适配器的代码。你能给我吗? - offset
3个回答

33

很遗憾,似乎没有简单的方法可以在不调用setMultiChoiceItems()的情况下切换AlertDialog的多选模式。

但是,您可以设置一个适配器,然后在包含的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();

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

    }
});

要获取哪些项目被选中,您需要相应地规划适配器。

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>

如果它正确,请将其修正。


不是我想要的,因为它“破坏了”我已经有的其他AlertDialog的风格。 - Filipe Batista

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接