2012-03-31 2 views
10

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

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() будет работать, но я не верю, что так и должно быть.

ответ

12

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

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

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

+0

Я вижу. Я думал, что будет синтаксис языка для использования, чтобы попасть в адаптер, о котором я не знал. BTW 'that' должно быть окончательным. – Chloe

+1

Я предпочитаю этот подход, поскольку он легко читается и ясен. – skrat

+0

Я получаю ошибку компиляции на линии Адаптер, который = Adapter.this; (Адаптер не входит в класс). Вместо этого вам лучше сказать конечный адаптер, который = это .. если вообще .. – sethu

0

его просто: попробуйте outer.remove без этого класса указатель

+0

Это не сработает. remove() не является методом Outer. Это метод адаптера. – Chloe

1

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

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

Я это знаю. Но что, если Listener имеет метод remove(). И что? – Chloe

+1

Хороший вопрос! Я займусь этим вечером. – Bohemian

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