在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()); } } } 

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

  • RecyclerView中的共享元素转换
  • 如何处理RecyclerView.ItemDecoration中的点击事件?
  • 如何在Android RecyclerView上对string进行sorting?
  • android.support.v7.app.AlertController.RecycleListView和android.support.v7.widget.RecyclerView之间的区别
  • RecyclerView中的滑动和OnClick事件
  • 如何滚动scrollview内的recyclerview中的特定位置?
  • 如何在eclipse中添加Android Support v7库?
  • 仅在getItemViewType更改时才调用RecyclerView onBindViewHolder
  • 这是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); }