android - RecyclerView Image background change randomly -
i've implemented recyclerview cardview. each cardview has imageview want change background color depending on result of query (empty result set -> grey / non empty result set -> red), implemented on onbindviewholder of recyclerview adapter.
here's adapter's code (i've removed of code sake of clarity):
public class favdirsadapter extends recyclerview.adapter {
private layoutinflater minflater; private cursor mcursor; private context mcontext; private int range; private fragmentmanager mfragmentmanager; public favdirsadapter(context context, cursor cursor, fragmentmanager fm) { minflater = layoutinflater.from(context); mcursor = cursor; mcontext = context; range = cursor.getcount(); mfragmentmanager = fm; } @override public favdirsviewholder oncreateviewholder(viewgroup parent, int viewtype) { final view view = minflater.inflate(r.layout.item_fav_dirs_list, parent, false); return new favdirsviewholder(view); } @override public void onbindviewholder(final favdirsviewholder viewholder, final int position) { if (mcursor.movetofirst()) { mcursor.movetoposition(position); viewholder.favdirsitemtextview.settext(mcursor.getstring(mcursor.getcolumnindex( (filmocontract.favdirentry.column_dir)))); getdirimage(viewholder); setscheduledfilmscolor(viewholder); } } @override public int getitemcount() { if (mcursor.movetofirst()) { return range; } return 0; } class favdirsviewholder extends recyclerview.viewholder{ textview favdirsitemtextview; imageview favdirsitemimageview; imageview favdirsitemscheduledfilmsimage; public favdirsviewholder(view itemview) { super(itemview); favdirsitemtextview = (textview) itemview.findviewbyid(r.id.fav_dirs_item_text_view); favdirsitemimageview = (imageview) itemview.findviewbyid(r.id.fav_dirs_item_image_view); favdirsitemscheduledfilmsimage = (imageview) itemview.findviewbyid(r.id.fav_dirs_item_scheduled_films_image_button); } } private void setscheduledfilmscolor(favdirsviewholder viewholder) { new setscheduledfilmscolor(viewholder, mcontext).execute(); } private void getdirimage (favdirsviewholder viewholder) { new fetchfavdirsimage(viewholder, mcontext).execute(); }
}
the adapter receive cursor films director data list stored on db. assign each row data viewholder fileds.
then make additional query determine wheter each director has movies scheduled soon, , depending on query result, color imageview (favdirsitemscheduledfilmsimage) background.
i tried first make query on onbindviewholder adapter's method, i've found imageviews, colored in same color (grey). since there db query involved, i've tried create asynctask (setscheduledfilmscolor) stuff. here's code:
public class setscheduledfilmscolor extends asynctask<void, void, boolean> { private imageview mimagebutton; private string mdirname; private context mcontext; boolean scheduledfilms; static final string[] program_columns = { filmocontract.filmentry._id, filmocontract.filmentry.column_date, filmocontract.filmentry.column_time, filmocontract.filmentry.column_cycle, filmocontract.filmentry.column_title, }; public setscheduledfilmscolor(favdirsadapter.favdirsviewholder viewholder, context context) { mimagebutton = viewholder.favdirsitemscheduledfilmsimage; //mimagebutton = new imagebutton(mcontext); mdirname = viewholder.favdirsitemtextview.gettext().tostring(); mcontext = context; } @override protected boolean doinbackground(void... params) { uri filmodirector = filmocontract.filmentry.buildprogramuriwithdirector(); cursor tempcursor = mcontext.getcontentresolver().query( filmodirector, program_columns, mdirname, null, null ); scheduledfilms = tempcursor.movetofirst(); tempcursor.close(); return scheduledfilms; } @override protected void onpostexecute(boolean scheduledfilms) { super.onpostexecute(scheduledfilms); mimagebutton.setimageresource(r.drawable.ic_new_releases_white_24dp); if (scheduledfilms) { //mimagebutton.getbackground().clearcolorfilter(); mimagebutton.getbackground().setcolorfilter( mcontext.getresources().getcolor(r.color.lafilmo_color), porterduff.mode.multiply ); } else { //mimagebutton.getbackground().clearcolorfilter(); mimagebutton.getbackground().setcolorfilter( mcontext.getresources().getcolor(r.color.dividers), porterduff.mode.multiply ); } }
}
i'm changing color in onpostexecute method. however, doing asynchronously, doesn't matter query result (i'm sure query , onpostexecute condition fine, have debug that). more, each time reload recyclerview fragment while navigating through app, colored imageviews different each time.
i don't understand, how recyclerview can maintain reference correctly other cardview fields (the fileds on viewholder, favdirsitemtextview or favdirsitemimageview) assigned on onbindviewholder, , not maintain reference colored imageview (favdirsitemscheduledfilmsimage).
can shed light on this? there better way this?
thanks!
Comments
Post a Comment