2012-01-27 9 views
2

渡されたコンテキストを使用した後のif文GetViewメソッドINT、私はこれを持っている:。私は渡されたコンテキストをキャプチャし、私のArrayAdapterクラスでArrayAdapter

if(m.getSide() == RED) { 
    v.setBackgroundColor(lc.getResources().getColor(R.color.red_bouy)); 
    Log.d("MA", "HERE"); 
} else if(m.getSide() == BLACK) { 
    v.setBackgroundColor(lc.getResources().getColor(R.color.black_bouy)); 
} 

(LCは、私はコンストラクタからつかむコンテキストです)

私は単にColor.redを使用すれば、それは見つけることができます。私が見たすべての例では、ghet getResources ...を使用していますが、アクティビティ内からのものです。
提案がありますか?

答えて

8

アダプタを作成するときは、のコンテキストをコンストラクタに渡します。 getView()getContext()。getResources()。get ...これはあなたが探していたものですか?

また、@MahdeToは正しいです:あなたはライブ参照を文脈にとどめているようです - そうではありません!あなたはあなたの文脈を漏らすでしょう。あなたが絶対に必要な場合は、WeakReference <のコンテキスト>を使用し、のヌルを確認してください。しかし、なぜそうする必要はありません。

UPD:そうでもないAdapter秒(これを指摘して@Arhimedと@RperryngにTNX)に問題が彼らの正しい使用方法は、彼らのライフサイクルはそのContextのそれを超えない保証しますので、店舗にOKですので、 Context [へのライブリンクは、アダプター自体にContextのライブ参照がある場合でも - GCはかなり精巧ですが、循環参照によってだまされません]。それにもかかわらず、この場合にはそれをする必要はありません:ArrayAdapter.getContext()は、まさにこの目的のためにそこにある - あなたは、リソースにアクセスし、あなたが実際にContextインスタンスを渡し、getView()

+0

恐ろしいです。それはそれをした!最初はうまくいかなかったが、清潔で再構築した後、チャンピオンのように働いた。あなたがた両方に感謝します。 – spuppett

+0

興味深いことに、arrayAdapter https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ArrayAdapter.javaのソースコードを見ると、コンテキストに対するハードリファレンスを保持しているようですコンストラクタに渡されたオブジェクト – rperryng

+1

@Rperryng yeah、あなたとArhimedが正しいです、アダプタにコンテキストがリンクされていることに問題はないはずです - アダプタ自体がリークされていない(何らかの理由でアクティビティレクリエーションの間に保持されていない)別の問題になります。 –

2

この種のリソースローディングでは、Context.getApplicationContext()を使用して静的メソッドを使用して、ビューに属していないコンテキストを取得します。これにより、潜在的なメモリリークを回避できます。

+0

これは非静的メソッドのエラーを返します。 –

9

まあでビューを作成するために、1つを必要とするときInflaterを得ることができますアダプターとの参照を維持することは、メモリリークなどのような問題の原因であってはなりません。私はそう考えています。例えば、ArrayAdapter<T>のソースをチェックするとコンストラクタにContextも受け入れられます(もっと重要なことです)プライベートメンバーmContextを介してそれを強く参照し、 getContext()。また、何とかContextを参照から切り離すことができるコードはありませんので、アダプタが存在する限りそこに存在します。

パフォーマンスに関しては、カスタムアダプタコンストラクタで色を定義してからgetView()で直接使用し、getContext().getResources().getColor()を何度も呼び出す必要はありません。

+2

ええ、はい、コードを見て、私はあなたが正しいと思う、弱い参照や他のprecaucionsそこに。アクティビティの際にアダプタが破壊されるため、アダプタのアクティビティへの参照を保持することが安全です。それでも、これは既に存在するので冗長です:) –

関連する問題