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 ...,但是来自一个活动.
有什么建议?
实际上,实际将Context实例传递给适配器并保持其引用不应该是任何问题的来源(如内存泄漏等).我是这么认为的,因为如果你检查一下源代码ArrayAdapter<T>,那么你会看到它Context在构造函数中也接受了(更重要的是)它通过私有成员保留了对它的强引用,mContext并为它提供了一个getter getContext().它也没有任何代码可以以某种方式取消Context与引用的链接,因此只要适配器存在,它就会存在.
但是在性能方面,我会在自定义适配器构造函数中定义颜色,然后直接在它中使用它们getView()而无需getContext().getResources().getColor()多次调用.
创建适配器时,将Context传递给构造函数.在getView()中你可以调用getContext().getResources().get ...这就是你要找的东西吗?
另外,@ MadedeTo是对的:你似乎保持对上下文的实时引用 - 不要!你会泄露你的背景.如果你绝对必须,使用WeakReference <Context>并检查null,但我不明白你为什么要这样做.
UPD:不是Adapters 的问题(tnx到@Arhimed和@Rperryng指出这一点),因为它们的正确使用确保它们的生命周期不超过它们的生命周期Context,所以可以存储实时链接到Context[ 即使适配器本身有一个实时引用Context- GC非常聪明,不会被循环引用愚弄].然而,在这种情况下没有必要这样做:ArrayAdapter.getContext()是出于这个目的 - 所以你可以访问资源并获得一个Inflater什么时候需要一个来构建视图getView()
| 归档时间: |
|
| 查看次数: |
4958 次 |
| 最近记录: |