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
Post a Comment