Диалоговое окно с несколькими вариантами предупреждений

Мне нужно создать 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 в качестве параметра при создании списка с множественным выбором.

Мне нужно установить пользовательский макет для каждой строки, потому что я использую рисоваемые селекторы для установки фона строки и цвета текста.

Есть идеи?

PS. Вот исходный код AlertDialog для получения дополнительной информации. https://android.googlesource.com/platform/frameworks/base.git/+/android-4.2.2_r1/core/java/android/app/AlertDialog.java

2 ответа

Решение

Ну, я знаю, что должен создать собственный диалог, но сейчас у меня нет времени, чтобы сделать это... вот как я взломал эту проблему:

        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 из диалогового окна, а затем сам его настраиваю.

Я бы порекомендовал вам создать свой собственный класс диалога следующим образом:

Настройка диалога путем расширения Dialog или AlertDialog

Как создать настраиваемое диалоговое окно в Android?

Таким образом, вы получите полный контроль над своим диалогом и сможете настроить его так, как вам удобно.

Кроме того, если после этого у вас все еще остаются проблемы с представлением списка, вы можете полностью настроить элементы представления списка: (Вы можете только незначительно влиять на фон и текст через xml и селекторы, не выполняя свою собственную реализацию)

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

Попробуйте, это может показаться сложным, но когда вы сделаете это однажды, это будет очень просто и будет творить чудеса для вас в ваших будущих проектах развития.

Другие вопросы по тегам