在ArrayAdapter中使用传递的Context

时间:2012-01-27 17:19:21

标签: android android-arrayadapter

在我的ArrayAdapter类中,我捕获传入的上下文。然后在getView方法中,我有这个if语句:

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 ...,但是来自一个活动 有什么建议吗?

3 个答案:

答案 0 :(得分:9)

好吧,实际上将Context实例传递给适配器并保持其引用不应该是任何问题的来源(如内存泄漏等)。我是这么认为的,因为如果您查看ArrayAdapter<T>的来源,那么您会看到它在构造函数中接受Context并且(更重要的是)它通过私有成员保留对它的强引用mContext并且有一个吸气剂 - getContext()。它也没有任何代码可以以某种方式取消Context与引用的链接,因此只要适配器存在,它就会存在。

但是在性能方面,我会在自定义适配器构造函数中定义颜色,然后直接在getView()中使用它们,而无需多次调用getContext().getResources().getColor()

答案 1 :(得分:8)

创建适配器时,将 Context 传递给构造函数。在 getView()中,您可以调用 getContext()。getResources()。get ...这就是您要找的内容吗?

另外,@ MadedeTo是对的:你似乎保持对上下文的实时引用 - 不要!你会泄露你的背景。如果您绝对必须,请使用WeakReference&lt; Context&gt;并检查 null ,但我不明白你为什么要这样做。

UPD:对于Adapter来说并不是一个问题(tnx指向@Arhimed和@Rperryng指出这一点),因为它们的正确用法可确保它们的生命周期不超过它们的生命周期Context,因此可以将实时链接存储到Context [,即使适配器本身在Context中有实时引用 - GC很聪明,不是'被循环引用愚弄] 。然而,在这种情况下没有必要这样做:ArrayAdapter.getContext()就是出于这个目的 - 所以当你需要在Inflater中构建视图时,你可以访问资源并获得getView()

答案 2 :(得分:2)

对于这种资源加载,使用Context.getApplicationContext()静态方法来获取不属于视图的上下文。这样可以避免潜在的内存泄漏。