3

我正在使用一个使用 ViewHolder 模式并利用缓存机制的列表视图。这是我尝试设置列表项背景之一的代码片段

if(drawable!=null)
    {
        if(this.backgroundBurnColor!=null && this.backgroundBurnColor.getValue()!=0)
        {
            Log.d("burncolor", this.backgroundBurnColor.getValue()+"");
            drawable.setColorFilter(this.backgroundBurnColor.getValue(), Mode.MULTIPLY);


        }else if(this.burnColorKey!=null)
        {
            Log.d("burncolor", this.Owner.getOwner().getColors().get(this.burnColorKey).getValue()+"");
            drawable.setColorFilter(this.Owner.getOwner().getColors().get(this.burnColorKey).getValue(), Mode.MULTIPLY);
        }else{
            drawable.setColorFilter(null);
        }
        v.setBackgroundDrawable(drawable);
    }

在此代码中,drawable 用于相同的项目类型,但即使当我更改可绘制图像时相同的项目类型,它也会根据需要更改。但是更改可绘制的颜色过滤器会更改出现在屏幕上的列表部分中的每个可绘制过滤器。例如,当我向下滚动列表并且屏幕上出现不同的颜色过滤器时,然后所有可绘制对象的颜色过滤器都变成相同的过滤器,我需要为我的每一行获取单独的颜色过滤器。有什么帮助吗?谢谢

4

2 回答 2

17

对于那些想知道答案的人,Romain Guy 有一篇关于 android 中可绘制突变的博客文章: http ://www.curious-creature.org/2009/05/02/drawable-mutations/

当从资源中引用drawable时,只有一个Drawable实例被初始化,所以所有引用都指向同一个对象。为此,有 mutate()一种可绘制的方法

而不是写

 drawable.setColorFilter(null);

写作

 drawable.mutate().setColorFilter(null);

会解决问题

于 2012-07-18T13:51:05.070 回答
0

彩色滤光片设置在Drawable. 因此,如果您不希望两个项目具有相同的滤色器,则应该Drawable为这两个项目设置两个单独的对象。

于 2012-07-11T16:46:17.343 回答