Два двойных вложенных анонимных внутренних класса. Как получить анонимных членов класса 1-го уровня?

Внутренний класс - это Adapter, внутренний-внутренний класс - Listener. Как получить доступ (скрыть) Элементы/методы адаптера от прослушивателя?

list.setAdapter(new Adapter() {
  public View getView() {
    // ...
    button.setListener(new Listener() {
      public void onClick() {
        Adapter.this.remove(item);
      }
    );
  }
});

Обычно для доступа к членам внешних классов вы просто указываете Outer.this.member, но в этом случае он дал мне следующую ошибку (используя фактический класс):

error: not an enclosing class: ArrayAdapter

Итак, как вы должны получить доступ к внутренним членам класса из внутреннего внутреннего класса? Мне не нравятся многоуровневые вложенные анонимные классы, но в этом случае я изучаю новый API и пока не уверен в более чистом виде. У меня уже есть обходное решение, но я хотел бы знать в любом случае. remove() на самом деле не скрывается внутри-внутренним классом, поэтому указание этого класса в этом случае действительно не требуется, но нужно четко указать код, где именно этот метод remove(). Я также хотел знать, если он затенен. Я считаю, что использование Outer.$6.remove() будет работать, но я не думаю, что так и должно быть.

Ответ 1

Назначьте this переменной, затем получите доступ к этому самому сокровенному классу.

list.setAdapter(new Adapter() {
  public View getView() {
    final Adapter that = this;
    button.setListener(new Listener() {
      public void onClick() {
        that.remove(item);
      }
    );
  }
});

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

Ответ 2

Просто вызовите метод на адаптере напрямую:

list.setAdapter(new Adapter() {
  public View getView() {
    // ...
    button.setListener(new Listener() {
      public void onClick() {
        remove(item); // <-- this will call Adapter method of the anonymous class
      }
    );
  }
});

Ответ 3

его просто, как это: try outer.remove без этого указателя класса