android - 适配器中的可绘制动态着色为所有人更改颜色
问题描述
我使用 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 中所有可绘制的项目都具有相同的颜色,并且在滚动过程中会发生变化。
我怎样才能实现我的目标?我希望每件物品都有自己的颜色而不是改变。
解决方案
这可以使用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));
快乐编码!
推荐阅读
- javascript - DataTable 未格式化日期时间
- java - 在日期和时间之间用“T”解析时间戳
- python - 如何检查熊猫行中的连续差异
- java - 如何在java中转换泛型方法的返回?
- powershell - CIM、Win32_OperatingSystem 和 Win32ShutdownTracker
- oop - 从 OOP 的角度来看,在接口中声明类型/属性是否正确?
- ionic4 - 是否可以在离子选择器中自动选择并立即跳转到某个值?
- r - 将 R 中的多个 RDS 文件作为自定义函数中的多个对象加载
- excel - 如何使用vba从包含行索引的数组中选择特定行
- scala - scalaj Http标头未被识别