2012-03-31 77 views
10

內部類是Adapter,內部類是Listener。如何從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()會起作用,但我不認爲它應該是這樣。

回答

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

我明白了。我認爲會有一種語言語法來使用,以便獲得我不知道的Adapter。順便說一句''必須是最終的。 – Chloe 2012-04-01 00:03:49

+1

我更喜歡這種方法,因爲它易於閱讀和明確。 – skrat 2012-04-01 00:09:47

+0

我在Adapter上得到一個編譯錯誤:Adapter.this; (適配器不是封閉類)。相反,你應該說最終的適配器=這個..如果有的話.. – sethu 2013-01-09 13:08:44

0

了這樣簡單:儘量outer.remove沒有這個類的指針

+0

這是行不通的。 remove()不是Outer的一種方法。這是Adapter的一種方法。 – Chloe 2012-03-31 23:51:58

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 2012-03-31 23:49:39

+1

好問題!我今晚會研究它。 – Bohemian 2012-04-01 23:23:42