无法将不同的 Drawables 设置为 recyclerview 项目

Can't set different Drawables to recyclerview items

我有带有图像、文本和描述的回收视图。

现在,当我从服务器获取数据时,我也得到了 HEX 颜色,有了它,在 Asynctask 中,应用程序将使用颜色作为色调制作 Drawable。

但是当应用程序加载并完成所有操作时,所有可绘制项目都与最后一项相匹配。

你怎么看,帽子颜色相同,但不匹配数据库的六角形:

还有日志可以批准:

HatStoreFragment$JSONParse2:帽子十六进制:#d61b22帽子名称:Punainen Hattu HatStoreFragment$JSONParse2:帽子十六进制:#fff202帽子名称:Keltainen Hattu

我的适配器:

包 com.developerfromjokela.pusahub;

public class HatStoreAdapter extends RecyclerView.Adapter<HatStoreAdapter.MyViewHolder> {
    private String[] mDataset;

    // Provide a reference to the views for each data item
    // Complex data items may need more than one view per item, and
    private Context mContext;
    private List<HatStoreCard> appsList;
    private HatAdapterListener listener;


    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title, count;
        public ImageView thumbnail, overflow;
        public CardView cardView;


        public MyViewHolder(View view) {
            super(view);
            title = (TextView) view.findViewById(R.id.hattitle);
            count = (TextView) view.findViewById(R.id.hatdesc);
            thumbnail = (ImageView) view.findViewById(R.id.hatthumbnail);
            overflow = (ImageView) view.findViewById(R.id.hatoverflow);
            cardView = view.findViewById(R.id.hatcard_view);
        }
    }


    public HatStoreAdapter(Context mContext, List<HatStoreCard> appsList, HatAdapterListener listener) {
        this.mContext = mContext;
        this.appsList = appsList;
        this.listener = listener;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.hatstorecardview, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int postition) {
        HatStoreCard app = appsList.get(holder.getAdapterPosition());
        holder.title.setText(app.getName());
        holder.count.setText(app.getDescription());

        // loading album cover using Glide library
        if (CardAnimationConfig.animating) {
            setFadeAnimation(holder.cardView);
        }


        Glide.with(mContext).load(app.getAppicon()).into(holder.thumbnail);

        Log.e(getClass().getName(), "Drawable: "+ app.getAppicon().toString());
        holder.overflow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showPopupMenu(holder.overflow);
            }
        });
        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                listener.onHatSelected(holder.getAdapterPosition(), HatDetailsArrayHelper.getTitle(holder.getAdapterPosition()), HatDetailsArrayHelper.getDescription(holder.getAdapterPosition()), HatDetailsArrayHelper.getThumbnailImage(holder.getAdapterPosition()), HatDetailsArrayHelper.getType(holder.getAdapterPosition()), HatDetailsArrayHelper.getPrice(holder.getAdapterPosition()), HatDetailsArrayHelper.getDownloadableRes(holder.getAdapterPosition()), appsList.get(holder.getAdapterPosition()).getRequiredVersion(), appsList.get(holder.getAdapterPosition()).getHatID());
            }
        });

        holder.thumbnail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                listener.onHatSelected(holder.getAdapterPosition(), HatDetailsArrayHelper.getTitle(holder.getAdapterPosition()), HatDetailsArrayHelper.getDescription(holder.getAdapterPosition()), HatDetailsArrayHelper.getThumbnailImage(holder.getAdapterPosition()), HatDetailsArrayHelper.getType(holder.getAdapterPosition()), HatDetailsArrayHelper.getPrice(holder.getAdapterPosition()), HatDetailsArrayHelper.getDownloadableRes(holder.getAdapterPosition()), appsList.get(holder.getAdapterPosition()).getRequiredVersion(), appsList.get(holder.getAdapterPosition()).getHatID());
            }
        });
    }

    /**
     * Showing popup menu when tapping on 3 dots
     */
    private void showPopupMenu(View view) {
        // inflate menu
        PopupMenu popup = new PopupMenu(mContext, view);
        MenuInflater inflater = popup.getMenuInflater();
        inflater.inflate(R.menu.storecard_menu, popup.getMenu());
        popup.setOnMenuItemClickListener(new MyMenuItemClickListener());
        popup.show();
    }

    /**
     * Click listener for popup menu items
     */
    class MyMenuItemClickListener implements PopupMenu.OnMenuItemClickListener {

        public MyMenuItemClickListener() {
        }

        @Override
        public boolean onMenuItemClick(MenuItem menuItem) {
            switch (menuItem.getItemId()) {
                case R.id.action_download:
                    Toast.makeText(mContext, "Ladataan", Toast.LENGTH_SHORT).show();
                    return true;
                default:
            }
            return false;
        }
    }

    @Override
    public int getItemCount() {
        return appsList.size();
    }

    public interface HatAdapterListener {

        void onHatSelected(int position, String hatname, String hatdescription, String hatthumbnail, String hattype, int hatprice, String appdownloadableres, int requiredversion, int hatID);
    }

    public Intent getItemIntent(int postition, Context context) {
       Intent intent =  intents.get(postition);
       return intent;
    }
    private void setFadeAnimation(View view) {
        AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f);
        anim.setDuration(200);
        view.startAnimation(anim);
    }




}

还有 HatStoreCard Class:

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;
    }
}

我希望有足够的日志和信息。

如果有人能说出为什么会这样,非常感谢他。

编辑: 这是制作 Drawable 的代码:

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


                        });
                    }

如果这是重复的,我很抱歉,我没有找到答案(也许我的英语知识不好,所以我没有搜索正确的问题来得到答案我需要)。

此致, 来自 Jokela 的开发者

在监听器中改变你的项目后,你应该通知你的项目被改变了,所以调用适配器方法notifyDataSetChanged(),它发出重绘回收信号。

或者,如果您想要更高的性能,请使用 notifyItemChanged(index),其中索引是您的元素位置。

因此,在您的情况下,只需在您的侦听器中添加一个参数(对适配器的引用),并在该方法的末尾调用我提到的方法之一。

每次从资源加载 Drawable 对象时,您将获得一个唯一的 Drawable 对象实例。 但是,这些独特的可绘制对象中的每一个都将共享一个单一的Drawable.ConstantState对象。当您修改可绘制对象的色调时,这是此常量状态的一部分,因此即使看起来您正在修改一个独特的可绘制对象,您实际上也会影响从同一资源加载的所有其他可绘制对象。

当你不想要这个优化时,你可以在加载的drawable上调用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));

它对我有用:

Drawable icon = getResources().getDrawable(R.drawable.ic_hat_cropped_v3);
icon.setColorFilter(Color.parseColor(appdownloadableres), MULTIPLY);
image.setBackgroundDrawable(icon);