2017-08-15 101 views
0
final ArrayAdapter adapter = new ArrayAdapter(...); 
listView.setOnItemClickListener(new AdapterView.OnitemClickListener(){ 
    @Override 
    public void onItemClick(AdapterView<?> parent,View view,int position,long id){ 
     Word word = adapter.getItem(position); 
    } 
}); 

我不明白爲什麼匿名內部類調用「適配器」對象應該聲明爲「最終」?這是一個規則嗎?我應該記住嗎? 我知道聲明爲final的變量將保存其引用而不會改變。但在上面的例子中,沒有引用的改變,我只是在最終對象上調用一個方法。爲什麼匿名內部類在外部對象聲明爲最終時調用外部對象

+0

它是有效的最終 – Jerry06

+0

匿名內部類解決一個簡單而有效的方法的一些惱人的問題。當我們無法擴展最終的類時,它們還允許您在Adapter類處理事件時創建更高效​​的代碼。 – Tehmina

回答

1

這是因爲您正嘗試訪問偵聽器中的適配器(並且您不知道何時會發生這種情況)。所以,你需要聲明它是最終的,因爲這意味着每當你從監聽器獲得回調時,引用都是一樣的。當函數被銷燬時,函數中聲明的所有非最終引用也將被銷燬。然後,您將嘗試稍後在偵聽器中訪問的引用將不再存在。

所以你有兩個解決方案:聲明它的最終(即使在函數被「銷燬」之後也保留參考)或者聲明它是全局的。

+0

這個函數說setonItemClickListener方法?我怎麼知道這個函數在引用被破壞之後不會被使用? – GeniusL

+0

我的意思是,當你使用setOnItemClickListener時,你就像給組件分配一個行爲一樣。每次調用函數時,都會創建新的引用,當您離開函數時,這些引用將被銷燬。一個解決方案,如果你不想要最終的解決方案是聲明你的適配器以外的任何函數(甚至在onCreate之外),因爲它使變量全局和你保留​​參考。如果您不需要在偵聽器外部使用該變量,您還可以在偵聽器中聲明變量 –

+0

我可以理解,當我的適配器仍然存在時,爲了調用onItemClickListener方法?所以我宣佈它是最終的。 你說每次調用函數,都會創建一個新的引用,誰引用誰? – GeniusL

相關問題