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

Мне нужно создать 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


person Community    schedule 09.10.2013    source источник


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

person Community    schedule 10.10.2013
comment
Почему вы устанавливаете адаптер дважды? - person PavelGP; 15.11.2016

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

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

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

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

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

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

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

person JanBo    schedule 09.10.2013
comment
Я боялся получить такой ответ :) Я думал получить объект ListView из диалога, а затем настроить все вручную (адаптер, режим выбора, выбранные элементы и т. д.). Я просто не понимаю, почему Google не добавил конструктор с адаптером для setMultiChoiceItems... - person ; 10.10.2013
comment
Ну, google не нашел многого, как вы увидите :) ... если вам нужна пользовательская строка в представлении списка с цветным текстом и изображением, она должна быть сделана на заказ :) Поверьте мне, я очень ненавидел такие вещи, но как как только вы пройдете через это, как только это станет действительно легко. Это только кажется, что много работы, но даст вам практически неограниченное количество возможностей для ваших приложений... поскольку вы будете использовать тот же способ для настройки автозаполнения текстов, счетчиков, выпадающих меню и многих других вещей, которые используют адаптеры... и нет хорошего приложения без пользовательских списков, адаптеров и диалогов :) - person JanBo; 10.10.2013