在RecyclerView中改变单个drawable的颜色将改变所有的drawable

我只是试图改变我的行内我的drawable的颜色取决于一个值,而不是一个可绘制的适配器改变了所有的人。

这是我的适配器:

public class ReportAdapter extends RecyclerView.Adapter<ReportAdapter.ReportViewHolder> { DataBaseHelper dataBase; private LayoutInflater inflater; List<ChoosedSubject> data = Collections.emptyList(); Context context; OnItemClickListener itemClickListener; public ReportAdapter(Context context, List<ChoosedSubject> data, OnItemClickListener itemClickListener) { inflater = LayoutInflater.from(context); this.data = data; this.context = context; this.itemClickListener = itemClickListener; } @Override public ReportViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.report_cell, parent, false); ReportViewHolder holder = new ReportViewHolder(view); dataBase = new DataBaseHelper(context); return holder; } //Set Data inside RecyclerView @Override public void onBindViewHolder(ReportViewHolder holder, int position) { ChoosedSubject current = data.get(position); Grades grades = new Grades(context); Resources resources = context.getResources(); int iconColor; Drawable icon; icon = ContextCompat.getDrawable(context, dataBase.getSpecificChoosedSubjectAppendingToName(current.getName()).get(0).getChoosedIcon()); if (dataBase.getSpecificChoosedSubjectAppendingToName(current.getName()).get(0).getChoosedIcon() != R.drawable.subject_default) { iconColor = resources.getColor(dataBase.getSpecificChoosedSubjectAppendingToName(current.getName()).get(0).getChoosedColor()); icon.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN); holder.icon.setBackground(icon); } else { holder.icon.setImageResource(R.drawable.subject_default); } holder.subject.setText(current.getName().toString()); NumberFormat formatter = NumberFormat.getNumberInstance(); formatter.setMinimumFractionDigits(0); formatter.setMaximumFractionDigits(0); String output = formatter.format(dataBase.getSpecificChoosedSubjectAppendingToName(current.getName()).get(0).getAverage()); int formattedValue = Integer.valueOf(output); //CHANGING COLOR DEPENDING ON VALUE int boxColor = 0; Drawable box = ContextCompat.getDrawable(context, R.drawable.markbox); Drawable boxBorder = ContextCompat.getDrawable(context, R.drawable.markbox_border); if (formattedValue >= 10) { boxColor = resources.getColor(R.color.positive); } else if (formattedValue >= 4 && formattedValue <= 9) { boxColor = resources.getColor(R.color.neutral); } else if (formattedValue < 4) { boxColor = resources.getColor(R.color.negative); } box.setAlpha(204); box.setColorFilter(boxColor, PorterDuff.Mode.SRC_IN); boxBorder.setColorFilter(boxColor, PorterDuff.Mode.SRC_IN); holder.markbox.setImageDrawable(box); holder.markboxBorder.setImageDrawable(boxBorder); holder.average.setText(output); holder.average.setTypeface(EasyFonts.robotoBlack(context)); } @Override public int getItemCount() { return data.size(); } public class ReportViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView subject; ImageView icon; ImageView markbox; ImageView markboxBorder; TextView average; public ReportViewHolder(View itemView) { super(itemView); subject = (TextView) itemView.findViewById(R.id.report_subject); icon = (ImageView) itemView.findViewById(R.id.report_icon); markbox = (ImageView) itemView.findViewById(R.id.report_markbox); markboxBorder = (ImageView) itemView.findViewById(R.id.report_markbox_border); average = (TextView) itemView.findViewById(R.id.report_average); itemView.setOnClickListener(this); } @Override public void onClick(View v) { itemClickListener.onItemClick(v, this.getAdapterPosition()); } } } 

知道有人该怎么办? 感谢您的帮助!!!

Solutions Collecting From Web of "在RecyclerView中改变单个drawable的颜色将改变所有的drawable"

这是caching。 从Android文档 :

如果您从相同的图像资源实例化两个Drawable对象,然后更改其中一个Drawable的属性(例如alpha),那么它也会影响另一个Drawable。 因此,在处理图像资源的多个实例时,不要直接转换Drawable,而应该执行补间animation。

创build后的Drawable.mutate()应该可以解决这个问题。

一个可变的drawable保证不与其他drawable共享状态。 当您需要修改从资源加载的绘图的属性时,这是特别有用的。 默认情况下,从同一资源加载的所有可绘制实例共享一个共同的状态; 如果您修改一个实例的状态,则所有其他实例将收到相同的修改。

像这样的东西:

 Drawable box = ContextCompat.getDrawable(context, R.drawable.markbox).mutate(); Drawable boxBorder = ContextCompat.getDrawable(context, R.drawable.markbox_border).mutate(); 

感谢Sergey,指导我解决问题。 我分享了我在onBindViewHolder方法中所做的。

 final Drawable drawable = ContextCompat.getDrawable(mContext, R.drawable.ic_icon).mutate(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { holder.image.setBackground(drawable); } else { holder.image.setBackgroundDrawable(drawable); }