2015-08-11 7 views
7

Ich habe versucht, die Farbe meiner Zeichen in meiner Zeile abhängig von einem Wert zu ändern, aber anstelle von einem Zeichen der Adapter änderte alle von ihnen.Ändern der Farbe der einzelnen Zeichen in RecyclerView wird alle Zeichen ändern

Hier ist mein Adapter:

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

    } 

} 

weiß jemand, was zu tun? Danke für Ihre Hilfe!!!

Antwort

18

Es ist eine Art Caching. Vom Android docs:

wenn Sie instanziiert zwei Drawable Objekte aus der gleichen Bildressource, dann eine Eigenschaft ändern (wie zB die alpha) für eine der Drawables, dann wird es auch die andere beeinflusst. Wenn Sie also mit mehreren Instanzen einer Bildressource arbeiten, sollten Sie, anstatt die Drawable direkt zu transformieren, eine Tween-Animation ausführen.

Drawable.mutate() nach der Erstellung sollte das Problem beheben.

Ein veränderbares Zeichen kann seinen Zustand nicht mit anderen Zeichen teilen. Dies ist besonders nützlich, wenn Sie Eigenschaften von Zeichenelementen ändern müssen, die von Ressourcen geladen werden. Standardmäßig teilen alle Zeichenauszugsinstanzen, die von derselben Ressource geladen werden, einen gemeinsamen Status. Wenn Sie den Status einer Instanz ändern, erhalten alle anderen Instanzen die gleiche Änderung.

Etwas wie folgt aus:

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

Vielen Dank. Es funktionierte für Fe. War mit dem gleichen Problem .. :) – Beena

+0

es hilft, danke. in meinem Fall 'für (Drawable zeichnbar: textView.getCompoundDrawables()) drawable.mutate()' funktioniert. – Wesely

0

Dank Sergey, die mich zu der Lösung geführt. Ich teile, was ich in OnBindViewHolder-Methode getan habe.

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); 
} 
Verwandte Themen