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