我使用齐射连接从服务器中获取字符串数组。每个单个字符串都以十六进制包含不同的颜色。我使用这种颜色在适配器中设置可绘制的色调。
这是我在适配器中的代码:
@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中所有可绘制项目的颜色都相同,并且在滚动过程中所有颜色都会改变。
我如何实现目标?我希望每个项目都有自己的颜色并且不要改变。
答案 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>);
}
这个想法是要强制回收者视图在项目上绘制一些东西,而不是重复使用已经设置的项目。