不同颜色过滤器的ListView缓存不起作用

时间:2012-07-11 14:40:52

标签: android android-listview android-view

我正在使用一个使用ViewHolder模式的listview并获得缓存机制的优势。这是一个代码片段,我尝试设置我的列表项目的背景之一

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适用于相同的项目类型,但即使我更改可绘制图像时相同的项目类型,它也会根据需要更改。但是改变drawable的滤色器会改变屏幕上出现的列表部分中的每个drawables过滤器。例如,当我向下滚动列表并且屏幕上出现不同的滤色器时,所有可绘制的滤色器都转向相同的滤镜,我需要为每一行获得单独的滤色器。有帮助吗?感谢

2 个答案:

答案 0 :(得分:17)

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

当从资源引用drawable时,只初始化了一个Drawable实例,因此所有引用都引用同一个对象。为此,有一个mutate() drawables方法

而不是写

 drawable.setColorFilter(null);

写作

 drawable.mutate().setColorFilter(null);

将解决问题

答案 1 :(得分:0)

滤镜设置在Drawable上。因此,如果您不希望两个项目具有相同的颜色过滤器,那么这两个项目应该有两个单独的Drawable个对象。