在ArrayAdapter中使用传递的Context

spu*_*ett 2 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));
}
Run Code Online (Sandbox Code Playgroud)

(lc是我从构造函数中获取的上下文)

如果我只使用Color.red,它可以找到.我见过的所有例子都使用ghet getResources ...,但是来自一个活动.
有什么建议?

Vit*_*nko 9

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

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

  • 嗯,是的,看看代码,我认为你是对的,没有WeakReferences或其他任何预防措施.适配器在活动时会被破坏,因此可以安全地在适配器中保留对活动的引用.尽管如此,这仍然是多余的,因为已经有一个:) (2认同)

Iva*_*sov 8

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

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

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