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

ikb*_*bal 3 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

ikb*_*bal 17

对于那些对这个答案感到疑惑的人来说,Romain Guy有一篇关于android中可绘制突变的博客文章:http: //www.curious-creature.org/2009/05/02/drawable-mutations/

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

而不是写作

 drawable.setColorFilter(null);
Run Code Online (Sandbox Code Playgroud)

写作

 drawable.mutate().setColorFilter(null);
Run Code Online (Sandbox Code Playgroud)

将解决问题