2013-10-09 3 views
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(); 
        } 
       }); 

Проблема заключается в том, что нет конструктора для setMultiChoiceItems который принимает параметр ListAdapter в качестве параметра при создании списка множественного выбора.

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

Любые идеи?

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

ответ

5

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

 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

setOnItemClickListener() не работает для меня – LoveForDroid

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/

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

+0

Я боялся получить такой ответ :) Я думал о том, чтобы получить объект ListView из диалогового окна, а затем установить все вручную (Адаптер, режим выбора, выбранные элементы и т. Д.). Я просто не понимаю, почему Google не добавил конструктор с адаптером для setMultiChoiceItems ... –

+1

Ну, google didnt много чего, как вы увидите :) ... если вы хотите, чтобы пользовательская строка выглядела в виде списка с цветным текстом и образ, который должен быть выполнен на заказ :) Поверьте мне, я ненавидел такие вещи, как много, но как только вы пройдете через него, как только станет очень легко. Это просто кажется большой работой, но даст вам в основном неограниченное количество возможностей для ваших приложений ... так как вы будете использовать тот же способ, чтобы настроить autocompletetextvies, прядильщики, выпадающие меню и многое другое, которые используют адаптеры ... и там нет «хорошего» приложения без пользовательских списков, адаптеров и диалогов :) – JanBo

Смежные вопросы