我有图像,文字和说明的recyclerview。
现在,当我从服务器获取数据时,我也获得了十六进制颜色,并且在Asynctask中,应用程序将使Drawable的颜色为着色。
但是,当应用加载并完成所有操作后,所有可绘制的项目都与最后一项匹配。
您怎么看,帽子是相同的颜色,但与数据库的十六进制不匹配:
日志也可以批准:
HatStoreFragment $ JSONParse2:帽子十六进制:#d61b22帽子名称:Punainen Hattu HatStoreFragment $ JSONParse2:帽子十六进制:#fff202帽子名称:Keltainen Hattu
我的适配器:
package com.developerfromjokela.pusahub;
public class HatStoreCard {
private String name;
private String description;
private Drawable appicon;
private int hatID;
private int requiredVersion;
public HatStoreCard() {
}
public HatStoreCard(String name, String description, Drawable haticon, int requiredVersion, int hatID) {
this.name = name;
this.description = description;
this.appicon = haticon;
this.requiredVersion = requiredVersion;
this.hatID = hatID;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public void setName(String name) {
this.name = name;
}
public int getRequiredVersion() {
return requiredVersion;
}
public int getHatID() {
return hatID;
}
public void setHatID(int hatID) {
this.hatID = hatID;
}
public void setRequiredVersion(int version) {
this.requiredVersion = version;
}
public void setAppicon(Drawable appicon) {
this.appicon = appicon;
}
public Drawable getAppicon() {
return appicon;
}
}
还有HatStoreCard类:
if (apptype.equals("tint")) {
Drawable icon = getResources().getDrawable(R.drawable.ic_hat_cropped_v3);
icon.setTintMode(MULTIPLY);
icon.setTint(Color.parseColor(appdownloadableres));
Log.e(getClass().getName(), "Hat Hex: "+appdownloadableres+ "Hat name: "+apptitle);
final HatStoreCard a = new HatStoreCard(apptitle, appshortdesc, icon, supportversion, hatID);
getActivity().runOnUiThread(() -> {
// Stuff that updates the UI
appsList.add(a);
});
}
我希望有足够的日志和信息。
如果有人可以说为什么会这样,那要非常感谢他。
编辑: 这是制作Drawable的代码:
{{1}}
如果这是重复的操作,对不起,我没有找到答案(也许我的英语知识不好,所以我没有搜索正确的问题来获得所需的答案)。
关于, 来自Jokela的开发人员
答案 0 :(得分:1)
每次从资源加载Drawable
对象时,都会得到一个唯一的Drawable
对象实例。 但是,这些唯一的可绘制对象将共享单个Drawable.ConstantState
对象。修改可绘制对象的颜色时,这是此常量状态的一部分,因此,即使看起来您正在修改唯一的可绘制对象,实际上也会影响从同一资源加载的所有其他可绘制对象。
当您不想进行此优化时,可以在已加载的可绘制对象上调用mutate()
方法。因此,替换此代码:
Drawable icon = getResources().getDrawable(R.drawable.ic_hat_cropped_v3); icon.setTintMode(MULTIPLY); icon.setTint(Color.parseColor(appdownloadableres));
与此:
Drawable icon = getResources().getDrawable(R.drawable.ic_hat_cropped_v3);
icon.mutate();
icon.setTintMode(MULTIPLY);
icon.setTint(Color.parseColor(appdownloadableres));
答案 1 :(得分:0)
在侦听器中更改项目之后,您应该通知您更改了哪些项目,因此请调用适配器方法notifyDataSetChanged()
,该方法表示重新绘制回收站。
或者,如果您想提高性能,请使用notifyItemChanged(index)
,其中索引是您的元素位置。
因此,在您的情况下,监听器中只有一个参数(对适配器的引用),在此方法的最后调用了我提到的方法之一。
答案 2 :(得分:0)
对我有用:
Drawable icon = getResources().getDrawable(R.drawable.ic_hat_cropped_v3);
icon.setColorFilter(Color.parseColor(appdownloadableres), MULTIPLY);
image.setBackgroundDrawable(icon);