具有自定义行布局的多选警报对话框

时间:2013-10-09 20:26:30

标签: android adapter alertdialog multiple-choice

我需要创建一个包含多项选项的AlertDialog,但是我在尝试将自定义布局文件设置为内​​部ListView时遇到了一些麻烦。

对于单选项,我使用一个以ListAdapter作为参数的构造函数,这样我就可以为每一行设置合适的布局资源:

        builder.setSingleChoiceItems(new ArrayAdapter<String>(getActivity(),
                R.layout.list_item_single_choice_answer, items), checkedItem,
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        checkedItem = which;
                        toggleEditTextAnswer(checkedItem == (items.length - 1));
                        dialog.dismiss();
                    }
                });

问题是 setMultiChoiceItems 没有构造函数在创建多选列表时接受ListAdapter作为参数。

我需要为每一行设置自定义布局,因为我使用drawable选择器来设置行背景和文本颜色。

有什么想法吗?

PS。这里是AlertDialog源代码以获取更多信息。 https://android.googlesource.com/platform/frameworks/base.git/+/android-4.2.2_r1/core/java/android/app/AlertDialog.java

2 个答案:

答案 0 :(得分:5)

嗯,我知道我应该创建一个自定义对话框但是现在我没有时间去做...所以这就是我攻击这个问题的方法:

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        // Set the adapter
        builder.setAdapter(
                new ArrayAdapter<String>(getActivity(),
                        R.layout.list_item_multiple_choice_answer, items), null)
        // Set the action buttons
                .setPositiveButton(android.R.string.ok,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.dismiss();
                            }
                        });

        AlertDialog alertDialog = builder.create();

        ListView listView = alertDialog.getListView();
        listView.setAdapter(new ArrayAdapter<String>(getActivity(),
                R.layout.list_item_multiple_choice_answer, items));
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                CheckedTextView checkedTextView = (CheckedTextView) view;
                checkedItems[position] = !checkedTextView.isChecked();
            }
        });
        listView.setDivider(null);
        listView.setDividerHeight(-1);

        alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {

            @Override
            public void onShow(DialogInterface dialog) {
                setCheckedItems(((AlertDialog) dialog).getListView());
            }
        });

        alertDialog.show();

首先我用项目设置适配器而不是调用setMultiChoiceItems我从Dialog中获取ListView对象,然后自己配置它。

答案 1 :(得分:0)

我建议您创建自己的对话框类:

Customizing dialog by extending Dialog or AlertDialog

How to create a Custom Dialog box in android?

通过这种方式,您可以完全控制对话框,并可以按照自己的方式进行自定义。

此外,如果您之后仍然存在列表视图问题,则可以完全自定义列表视图项:(您只能通过xml和选择器以较小的方式影响背景和文本,而无需执行自定义实现)

http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/

尝试一下,看起来似乎很难,但是当你做到这一点时,它将是小菜一碟,并将在你未来的开发项目中为你创造奇迹。