Два двойных вложенных анонимных внутренних класса. Как получить анонимных членов класса 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 без этого указателя класса