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