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

3

我需要创建一个带有多选项的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();
                    }
                });

问题在于,在创建多选列表时,没有接受ListAdapter作为参数的setMultiChoiceItems构造函数。
我需要为每一行设置自定义布局,因为我使用可绘制选择器来设置行背景和文本颜色。
有什么想法吗?
附注:以下是AlertDialog源代码,供参考。 https://android.googlesource.com/platform/frameworks/base.git/+/android-4.2.2_r1/core/java/android/app/AlertDialog.java
2个回答

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,然后从对话框中获取ListView对象,自己进行配置。


1
为什么你要设置适配器两次? - PavelGP

0
我建议您创建自己的对话框类,像这样: 通过扩展Dialog或AlertDialog自定义对话框 如何在Android中创建自定义对话框框? 这样,您将完全控制您的对话框,并可以按照您想要的任何方式进行自定义。
此外,如果您在此之后仍然遇到列表视图问题,您可以完全自定义您的列表视图项:(只能通过xml和选择器以小幅度影响背景和文本,而不进行自定义实现)

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

试一试,可能会感觉很难,但只要你做过一次,它就会变得轻而易举,并为你未来的开发项目带来奇迹。


1
我很害怕得到这样的答案 :) 我本来想从对话框中获取ListView对象,然后手动设置所有内容(Adapter、选择模式、选定项等)。我只是不明白为什么谷歌没有添加一个带有Adapter的构造函数来设置多选项... - user1774914
1
谷歌并没有做很多事情,你会发现 :) ...如果您想在列表视图中拥有自定义行,带有彩色文本和图像,则必须进行定制:) 相信我,我非常讨厌这样的事情,但一旦您通过一次,它就变得非常容易。 它似乎需要大量工作,但是将为您的应用程序提供基本上无限的可能性...因为您将使用相同的方式来自定义自动完成文本视图、微调器、下拉菜单和使用适配器的许多其他东西...而且没有一个"好"的应用程序没有自定义列表、适配器和对话框 :) - JanBo

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