Почему клики в моем ExpandableListView игнорируются?

У меня есть AlertDialog, заполненный ExpandableListView. Сам список работает отлично, но по какой-то причине клики игнорируются. Очевидно, мой обработчик клика никогда не вызывается.

Это код:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select something");
ExpandableListView myList = new ExpandableListView(this);
MyExpandableListAdapter myAdapter = new MyExpandableListAdapter();
myList.setAdapter(myAdapter);
myList.setOnItemClickListener(new ExpandableListView.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    ");
        }
    }
});
builder.setView(myList);
dialog = builder.create();
dialog.show();

Если я вместо этого попытаюсь заполнить AlertDialog простым списком, щелкните события, созданные без проблем:

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

ListView modeList = new ListView(this);
String[] stringArray = new String[] { "Bright Mode", "Normal Mode" };
ArrayAdapter<String> modeAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, stringArray);
modeList.setAdapter(modeAdapter);
modeList.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
          // When clicked, show a toast with the TextView text
          Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
              Toast.LENGTH_SHORT).show();
        }
      });


builder.setView(modeList);
AlertDialog dialog1 = builder.create();
dialog1.show();

В чем причина, по которой событие клика не выполняется в моем ExpandableListView, но не в обычном ListView? Я, вероятно, что-то пропустил, но я понятия не имею, что это может быть.

Ответ 1

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

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

Ответ 2

спасибо, мне тоже было интересно. Но все же интересна информация в документации:

public void setOnItemClickListener (AdapterView.OnItemClickListener l) "Зарегистрировать обратный вызов, который будет вызываться, когда элемент был нажат, и вызывающий абонент предпочитает получать позицию в стиле ListView вместо группы и/или дочерней позиции".

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

Ответ 3

Фактически вы можете использовать

  • expandableListView.setOnGroupExpandListener, чтобы поймать событие при расширении
  • expandableListView.setOnGroupCollapseListener, чтобы поймать событие при свертывании.
  • expandableListView.setOnGroupClickListener, чтобы поймать событие как при расширении, так и при свертывании

ссылка на сайт разработчика:

https://developer.android.com/reference/android/widget/ExpandableListView.html