In Honeycomb the Loader APIs were introduced as the proper way to provide data to an application by doing the heavy lifting on a background thread. In my application I\'m worki
The Loader
class by itself doesn't know when the dataset changes and is implementation specific to CursorLoader
currently. Now inside my application the data I needed to refresh is inside a local SQLite database (no ContentProvider) so I had to modify the CursorLoader
to use my local database instead, as Dianne Hackborne mentioned on the developer group.
Unfortunately just returning a Cursor from loadInBackground doesn't allow the ContentObserver
to properly notify the Loader when the data changes, this is because AbstractCursor
only calls notifyChanged()
when requery()
is called on the Cursor.
Since the ContentObserver
will never notify the Loader
that the data has changed, I ended up calling Loader.onContentChanged()
myself as needed. At this point it everything seems to be working but I'll update this answer if any significant issues arrise.
You must just do not create a new adapter in each Loaders loading; I mean..
@Override
public void onLoadFinished(Loader<List<NotificationItem>> loader, List<NotificationItem> notifications) {
// We must do it in this way to not losing listview scroll position after a reload.
if(mAdapter==null) {
mAdapter = new HomeUserActivityListAdapter(getActivity(), notifications);
mListView.setAdapter(mAdapter);
}else{
mAdapter.refill(notifications);
}
}
And in you adapter create a method to items refill
public void refill(List<NotificationItem> notifications) {
mNotificationsList.clear();
mNotificationsList.addAll(notifications);
notifyDataSetChanged();
}
And that's all, it will maintain your scroll position exactly :-)