首页 > 解决方案 > 适配器中的可绘制动态着色为所有人更改颜色

问题描述

我使用 volley 连接从我的服务器获取了一系列字符串。每个字符串都包含不同的十六进制颜色。我使用这种颜色来设置适配器中可绘制对象的色调。

这是我在适配器中的代码:

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
    // Get item from position
    MyObject object = array_data.get(position);
    ...
    ...
    Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.ic_beenhere_black_24dp);
    Drawable wrappedDrawable;
    if (unwrappedDrawable != null) {
        wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
        DrawableCompat.setTint(wrappedDrawable, object.getMyColor());
        holder.imvPreparationTime.setImageDrawable(wrappedDrawable);
    }

不幸的是,行为不正确。recyclerview 中所有可绘制的项目都具有相同的颜色,并且在滚动过程中会发生变化。

在此处输入图像描述

我怎样才能实现我的目标?我希望每件物品都有自己的颜色而不是改变。

标签: androidimageviewadapterdrawableandroid-viewholder

解决方案


这可以使用Drawable.mutate(). 在您的适配器类 onBindViewHolder(..) 块中,使用下面的代码片段来更改您的可绘制对象的色调 -

for (Drawable drawable : myTextView.getCompoundDrawablesRelative()) {
                    if (drawable != null) {
                        Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
                        Drawable mutableDrawable = wrappedDrawable.mutate();
                        DrawableCompat.setTint(mutableDrawable, ContextCompat.getColor(context, R.color.desiredColor));
                    }
                }

注意:这个代码片段我用来改变 textview 的 drawable 的色调。因此,如果您需要更改图像或可绘制文件的色调,只需执行以下操作:

Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
                        Drawable mutableDrawable = wrappedDrawable.mutate();
                        DrawableCompat.setTint(mutableDrawable, ContextCompat.getColor(context, R.color.colorGrayD5));

快乐编码!


推荐阅读