可在适配器中动态绘制的Tint可更改所有对象的颜色

时间:2019-10-22 07:54:57

标签: android imageview adapter drawable android-viewholder

我使用齐射连接从服务器中获取字符串数组。每个单个字符串都以十六进制包含不同的颜色。我使用这种颜色在适配器中设置可绘制的色调。

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

@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中所有可绘制项目的颜色都相同,并且在滚动过程中所有颜色都会改变。

enter image description here

我如何实现目标?我希望每个项目都有自己的颜色并且不要改变。

2 个答案:

答案 0 :(得分:1)

这可以使用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));

快乐编码!

答案 1 :(得分:0)

由于recyclerView会重复使用物品,因此通常会有这种行为。最简单的方法是为要设置色调的视图添加其他视图。 例如

if (unwrappedDrawable != null) {
        wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
        DrawableCompat.setTint(wrappedDrawable, object.getMyColor());
        holder.imvPreparationTime.setImageDrawable(wrappedDrawable);
    } else {
        holder.imvPreparationTime.setImageDrawable(<Some Other drawable, for example default one>);
    }

这个想法是要强制回收者视图在项目上绘制一些东西,而不是重复使用已经设置的项目。