gpt4 book ai didi

java - 在 RecyclerView 中更改单个可绘制对象的颜色将更改所有可绘制对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:58 26 4
gpt4 key购买 nike

我只是尝试根据一个值更改行内可绘制对象的颜色,但适配器更改了所有可绘制对象而不是一个可绘制对象。

这是我的适配器:

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

}

}

有人知道该怎么做吗?谢谢你的帮助!!!

最佳答案

这是一种缓存。来自Android docs :

if you instantiate two Drawable objects from the same image resource, then change a property (such as the alpha) for one of the Drawables, then it will also affect the other. So when dealing with multiple instances of an image resource, instead of directly transforming the Drawable, you should perform a tween animation.

Drawable.mutate()创建后应解决问题。

A mutable drawable is guaranteed to not share its state with any other drawable. This is especially useful when you need to modify properties of drawables loaded from resources. By default, all drawables instances loaded from the same resource share a common state; if you modify the state of one instance, all the other instances will receive the same modification.

像这样:

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

关于java - 在 RecyclerView 中更改单个可绘制对象的颜色将更改所有可绘制对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31944501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com