android - Multiple consecutive adapter notifyDataSetChanged calls do not refresh ListView -


this very serious buggy behavior , have no idea why not work.

my adapter (extending baseadapter) combines 2 independent types of data. 1 cursor, other takes list of elements. setters both take data , force notifydatasetchanged():

 public void setinformationscursor(final cursor newcursor) {     log.d(tag, "setinformationscursor called");     if (newcursor == informationscursor) {         return;     }     informationscursor = newcursor;      // work on cursor here extract data      notifydatasetchanged(); }  public void setrides(final list<ride> newridelist) {     log.d(tag, "setrides called");     ridelist = newridelist;     notifydatasetchanged(); } 

the data these elements gathered using 2 independent asynctaskloader using loader framework. more specificly, these setters called corresponding loadercallbacks.onloadfinished methods.

when user chooses display different data, both loaders fired in fragment:

getloadermanager().restartloader(ride_loader_id, args, rideloadercallbacks); getloadermanager().restartloader(information_loader_id, args, informationloadercallbacks); 

to visualize redraw of listview, log within adapter's getview method.

on main development device running android 4.3, works expected.

1) user triggers change 2) both loaders fire 3) 2 loaders finish independently, each firing notifydatasetchanged , see lots of getview log output, important: after second loader finishes, list redrawn again.

schematically:

  • trigger loader 1
  • trigger loader 2
  • loader 1 finished
  • notifydatasetchanged loader 1
  • getview pos 1 (reflecting changes loader 1's data)
  • getview pos 2 (reflecting changes loader 1's data)
  • getview pos 3 (reflecting changes loader 1's data)
  • loader 2 finished
  • getview pos 4 (reflecting changes loader 1's data)
  • notifydatasetchanged fron loader 2
  • getview pos 5 (reflecting changes loader 1's data)
  • getview pos 1 (reflecting changes loader 2's data)
  • getview pos 2 (reflecting changes loader 2's data)
  • getview pos 3 (reflecting changes loader 2's data)
  • getview pos 4 (reflecting changes loader 2's data)
  • getview pos 5 (reflecting changes loader 2's data)

the list displays new information fine.

but now, cannot believe this. on android 4.2 following happens:

  • trigger loader 1
  • trigger loader 2
  • loader 1 finished
  • notifydatasetchanged loader 1
  • getview pos 1 (reflecting changes loader 1's data)
  • getview pos 2 (reflecting changes loader 1's data)
  • getview pos 3 (reflecting changes loader 1's data)
  • loader 2 finished
  • getview pos 4 (reflecting changes loader 1's data)
  • notifydatasetchanged loader 2
  • getview pos 5 (reflecting changes loader 1's data)

  • the end - no more getviews should reflect second loader's notifydatasetchanged!

i hope more clear you.

my assumption on notifydatasetchanged called on ui thread is: each time call it, must force redraw of elements. not happen.


Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -