【问题标题】:Multiple choice alert dialog with custom row layout具有自定义行布局的多选警报对话框
【发布时间】:2013-10-11 02:04:14
【问题描述】:

我需要创建一个包含多项选择项的 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 作为参数的构造函数。

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

有什么想法吗?

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

【问题讨论】:

    标签: android adapter android-alertdialog multiple-choice


    【解决方案1】:

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

            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 对象,然后自己进行配置。

    【讨论】:

    • 为什么要设置两次适配器?
    【解决方案2】:

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

    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/

    尝试一下,这可能看起来很难,但一旦你这样做,它就会变得轻而易举,并且会在你未来的开发项目中为你创造奇迹。

    【讨论】:

    • 我害怕得到这样的答案 :) 我正在考虑从对话框中获取 ListView 对象,然后手动设置所有内容(适配器、选择模式、选定项目等)。我只是不明白为什么谷歌没有为 setMultiChoiceItems 添加一个带有适配器的构造函数......
    • 好吧,谷歌并没有你将看到的很多东西 :) ...如果你想在列表视图中使用彩色文本和图像自定义行,它必须是定制的 :) 相信我,我讨厌类似的事情很多,但是一旦你经历了它就会变得非常容易。看起来工作量很大,但基本上可以为您的应用程序提供无限量的可能性......因为您将使用相同的方式来自定义自动完成文本视图、微调器、下拉菜单和更多使用适配器的东西......而且没有自定义列表、适配器和对话框的“好”应用程序 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多