Android 动态着色可在适配器中绘制更改所有颜色

Android 动态着色可在适配器中绘制更改所有颜色,android,imageview,adapter,drawable,android-viewholder,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); ...

我使用截取连接从服务器获取字符串数组。每个字符串都包含不同的十六进制颜色。我用这种颜色来设置可拉伸适配器的色调

下面是适配器中的代码:

@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中所有可绘制的项目一起具有相同的颜色,并且在滚动期间所有项目都会发生变化


我如何实现我的目标?我希望每件物品都有自己的颜色,不要改变。

因为recyclerView正在重复使用物品,所以经常会有这样的行为。最简单的方法是为要设置色调的视图放置if-else。 例如

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

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

快乐编码

我尝试了这段代码,但其行为与前一段代码相同。为什么要我将else设置为“if unwrappedAddressable!”空'?此条件已为真,因为“由于Drawable UnwrappAddressable=AppCompatResources.getDrawablecontext,R.Drawable.ic\u Beenher\u black\u 24dp;”这篇文章给出了答案:
Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
                        Drawable mutableDrawable = wrappedDrawable.mutate();
                        DrawableCompat.setTint(mutableDrawable, ContextCompat.getColor(context, R.color.colorGrayD5));