2011-10-28 59 views
10

我在活動中有一個ListView,我正在爲ListView設置一個自定義適配器。應該在Android中的適配器是靜態內部類還是非靜態內部類

如果我的適配器類是:

private static class MyAdapter extends ArrayAdapter 

private class MyAdapter extends ArrayAdapter 

我想應該沒有什麼區別,只要適配器被包圍在活動引用中,但要確認這一點。

+0

(對於未來的讀者)最後一個問題是倒退。如果你有一個靜態的內部類,並且需要訪問活動/上下文,那麼你應該使用WeakReference(如果有任何事情可能超過活動)。如果該類不是靜態的並且是內部的,則它對外部類具有隱式強引用。在這種情況下,您仍然需要小心使用適配器的方式。使用靜態可以幫助找到隱式泄漏,但會增加傳遞上下文/弱引用的開銷。 – lilbyrdie

+0

此外,在調用帶View對象的適配器的任何調用中,上下文都可用(View.getContext())。你可以使用instanceof來確保它是你的活動。 – lilbyrdie

回答

15

如果您對使用適配器的方式非常小心,則可以在適配器內保持上下文狀態。適配器通常與其上下文(一個活動)的生命週期相關聯,所以沒關係。只有在有意義時才使用WeakReference。

+0

您能否詳細說明「小心如何使用適配器」部分?因此,適配器與活動生命週期綁定在一起看起來並不重要。 – dnkoutso

+1

例如,不要將適配器保存在比您的活動壽命更長的靜態字段中。 –

+0

@RomainGuy如果我們在'onDestroy()'中顯式地'null'靜態適配器對象呢?這是一個好方法嗎? –