Можно ли создать расширяемый список AlertDialog?

В моем приложении пользователи могут выбирать статьи для загрузки по разным критериям. Один из них - год и месяц. Для этого мне нужен AlertDialog со списком лет. Если затем пользователь нажмет на год, список расширится и покажет январь, февраль и т. д.

Я знаю, как сделать расширяемый список с помощью SimpleExpandableListAdapter, но это не то, что мне нужно. Поскольку другие критерии (например, категория) также являются списком AlertDialogs, я хочу что-то похожее по внешнему виду.

Можно ли выполнить такой расширяемый список AlertDialog?

РЕШЕНИЕ

Вот что у меня получилось на основе решения CommonsWare:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select something");

ExpandableListView myList = new ExpandableListView(this);
MyExpandableListAdapter myAdapter = new MyExpandableListAdapter();
myList.setAdapter(myAdapter);

builder.setView(myList);
AlertDialog dialog = builder.create();
dialog.show();

Единственная оставшаяся проблема: как реализовать прослушиватель onClick для AlertDialog? Обычно я делаю это в методе setItems(), но я не использую setItems.

Я добавил myList.setOnItemClickListener после myList.setAdapter(), но он игнорируется. Ничего не происходит, когда я нажимаю элемент:

myList.setOnItemClickListener(new ListView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> a, View v, int i, long l) {
        try {
            Toast.makeText(ExpandableList1.this, "You clicked me", Toast.LENGTH_LONG).show();
        }
        catch(Exception e) {
            System.out.println("something wrong here    ");
        }
    }
});

Решение проблемы с кликами:

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

Вместо этого вы должны реализовать OnChildClickListener(), который, как следует из названия, прослушивает дочерние клики!


person marlar    schedule 10.07.2011    source источник


Ответы (3)


Используйте setView() на AlertDialog.Builder, передав ExpandableListView, который вы надуете или создадите в коде Java и настроите свой адаптер.

person CommonsWare    schedule 10.07.2011
comment
Я немного поработал над этим и понял основную идею, но как мне создать список? Обычно я бы создал активность и раздул ее из xml, но в этом случае я не буду показывать список, кроме как в диалоговом окне. Поэтому мне как-то нужно создать расширяемый список внутри моей основной деятельности и передать его с помощью setView. Как я могу это сделать? Спасибо. - person marlar; 14.07.2011
comment
@marlar: либо раздуйте XML-ресурс макета, содержащий ExpandableListView, либо создайте его с помощью Java (например, новый ExpandableListView(this)`). - person CommonsWare; 14.07.2011
comment
У меня это работает! Единственная проблема сейчас, как мне реализовать onClick, когда я не использую builder.setItems()? Ничего не происходит, когда я нажимаю на элементы, диалоговое окно даже не закрывается. - person marlar; 14.07.2011
comment
@marlar: позвоните setOnItemClickListener() по телефону ExpandableListView, чтобы узнать о кликах. - person CommonsWare; 14.07.2011
comment
Я пробовал это, но, видимо, это игнорируется. Ничего не происходит, когда я нажимаю элементы. Смотрите код в моем отредактированном посте. - person marlar; 14.07.2011
comment
@marlar: у меня нет других предложений, кроме как переключиться на диалоговое действие. - person CommonsWare; 14.07.2011
comment
Ok. Я приму ответ и задам другой вопрос, если сам не решу эту проблему с кликом. Большое спасибо за твою помощь. - person marlar; 14.07.2011
comment
Хитрость заключалась в том, чтобы просто реализовать OnChildClickListener() вместо OnItemClickListener()! - person marlar; 16.07.2011
comment
Привет @CommonsWare. Я пытаюсь реализовать expandableListView с флажком в childView. событие проверки для флажка не работает, не могли бы вы помочь. Мой вопрос stackoverflow.com/questions/48547714 - person Inzimam Tariq IT; 31.01.2018

Ну, чтобы использовать списки, вы должны расширить соответствующую активность списка, в вашем случае ExpandableListActivity. Вы не сможете найти ExpandableListDialog для расширения.

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

person JustDanyul    schedule 10.07.2011

вы даже можете сделать android:theme="Theme.Dialog" в файле манифеста для этого конкретного действия.

person Bharat Chhatre    schedule 14.03.2012