java - Set ImageView color filter from adapter of RecyclerView -


i try set imageview colorfilter in class define adapter avec recyclerview. that, defined imageview arraylist in adapter stock imageview viewholder , take them custom method position parameter in adapter too. doesn't work, when click on items, colorfilter apply radomly on recyclerviex items :/

this code :

the adapter :  package com.ylly.hypred.process.adapter;  /**  * created ylly on 24/06/2015.  */ import android.content.contentresolver; import android.content.context; import android.net.uri; import android.support.v7.widget.recyclerview; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.imageview;  import com.squareup.picasso.picasso; import com.ylly.hypred.process.recyclerview.itemdataatelier; import com.ylly.hypred.r; import com.ylly.hypred.custom.mytextview;  import java.io.file; import java.util.arraylist;  public class atelieradapter extends recyclerview.adapter<atelieradapter.viewholder> {     private arraylist<itemdataatelier> itemsdata;     private context context;      public atelieradapter(arraylist<itemdataatelier> itemsdata, context context) {         this.itemsdata = itemsdata;         this.context = context;     }      // create new views (invoked layout manager)     @override     public atelieradapter.viewholder oncreateviewholder(viewgroup parent,                                                    int viewtype) {         // create new view         view itemlayoutview = layoutinflater.from(parent.getcontext())                 .inflate(r.layout.item_layout, null);          // create viewholder          viewholder viewholder = new viewholder(itemlayoutview);         return viewholder;     }      // replace contents of view (invoked layout manager)     @override     public void onbindviewholder(viewholder viewholder, int position) {          // - data itemsdata @ position         // - replace contents of view itemsdata          uri uri = uri.parse(contentresolver.scheme_android_resource + "://" + context.getpackagename() + "/drawable/" + itemsdata.get(position).getdrawable());         picasso.with(context).load(r.drawable.hypred_atelier_atelier).into(viewholder.imgviewicon);         viewholder.nomateliertextview.settext(itemsdata.get(position).getlabel());      }      // inner class hold reference each item of recyclerview     public static class viewholder extends recyclerview.viewholder {          public imageview imgviewicon;         public mytextview nomateliertextview;          public viewholder(view itemlayoutview) {             super(itemlayoutview);             imgviewicon = (imageview) itemlayoutview.findviewbyid(r.id.item_icon);             nomateliertextview = (mytextview) itemlayoutview.findviewbyid(r.id.item_layout_nom_atelier_textview);         }     }       // return size of itemsdata (invoked layout manager)     @override     public int getitemcount() {         return itemsdata.size();     } } 

my itemdata :

package com.ylly.hypred.process.recyclerview;  import android.graphics.drawable.drawable; import android.widget.imageview;  /**  * created ylly on 07/07/2015.  */ public class itemdatacriteres {      private string label;     private int drawable;     private boolean isactive;     private imageview imageview;      public void setisactive(boolean isactive) {         this.isactive = isactive;     }      public boolean getisactive() {          return isactive;     }      public itemdatacriteres(string label, int drawable){          this.label = label;          this.drawable = drawable;     }      public void setlabel(string label) {         this.label = label;     }      public string getnomatelier() {          return label;     }      public void setdrawable(int drawable) {         this.drawable = drawable;     }      public int getdrawable() {          return drawable;     }       public void setimageview(imageview imageview) {         this.imageview = imageview;     }      public imageview getimageview() {          return imageview;     }  } 

and class define recyclerview , change filter :

final criteresadapter criteresadapter = new criteresadapter(itemdatadetailsetthemes, v.getcontext()); recyclerviewcriteresone.setadapter(criteresadapter);  recyclerviewcriteresone.addonitemtouchlistener(         new recycleritemclicklistener(context, new recycleritemclicklistener.onitemclicklistener() {             @override             public void onitemclick(view view, int position) {                 if (!criteresadapter.getcritere(position).getisactive()) {                     criteresactifs[0]++;                     setlancerrecherchetextviewvisibility(v);                     criteresadapter.getimageview(position).setcolorfilter(v.getresources().getcolor(r.color.hypred_gris), porterduff.mode.multiply);                     criteresadapter.getcritere(position).setisactive(true);                     criteresadapter.notifydatasetchanged();                 } else {                     criteresactifs[0]--;                     setlancerrecherchetextviewvisibility(v);                     criteresadapter.getimageview(position).clearcolorfilter();                     criteresadapter.getcritere(position).setisactive(false);                     criteresadapter.notifydatasetchanged();                 }             }         })); 

thanks in advance time :)

from drawable docs:

by default, drawables instances loaded same resource share common state; if modify state of 1 instance, other instances receive same modification.

the answer call drawable.mutate()

a mutable drawable guaranteed not share state other drawable.

i change itemtouchlistener this:

recyclerviewcriteresone.addonitemtouchlistener(     new recycleritemclicklistener(context, new recycleritemclicklistener.onitemclicklistener() {         @override         public void onitemclick(view view, int position) {             drawable drawable = criteresadapter.getimageview(position);             drawable.mutate();             if (!criteresadapter.getcritere(position).getisactive()) {                 criteresactifs[0]++;                 setlancerrecherchetextviewvisibility(v);                 drawable.setcolorfilter(v.getresources().getcolor(r.color.hypred_gris), porterduff.mode.multiply);                 criteresadapter.getcritere(position).setisactive(true);                 criteresadapter.notifydatasetchanged();             } else {                 criteresactifs[0]--;                 setlancerrecherchetextviewvisibility(v);                 drawable.clearcolorfilter();                 criteresadapter.getcritere(position).setisactive(false);                 criteresadapter.notifydatasetchanged();             }         }     })); 

Comments