无法为Recyclerview项设置不同的Drawable

时间:2018-11-05 20:37:19

标签: android drawable

我有图像,文字和说明的recyclerview。

现在,当我从服务器获取数据时,我也获得了十六进制颜色,并且在Asynctask中,应用程序将使Drawable的颜色为着色。

但是,当应用加载并完成所有操作后,所有可绘制的项目都与最后一项匹配。 enter image description here

您怎么看,帽子是相同的颜色,但与数据库的十六进制不匹配:

enter image description here

日志也可以批准:

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的开发人员

3 个答案:

答案 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);