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

Popular posts from this blog

dns - How To Use Custom Nameserver On Free Cloudflare? -

python - Pygame screen.blit not working -

c# - Web API response xml language -