我正在编写一个Fragment
使用加载器来获取Cursor
有关地图上各种事物位置的包含数据的代码。我继承了代码,按与设备或搜索位置的距离对这些位置进行排序;距离度量并不是在 SQL 中特别容易实现的东西,所以CursorAdapter
我不是使用(和其他地方一样)从 中加载数据Cursor
,然后再对其进行排序。
我只有一个问题:当 Web 服务返回一组新的位置时(例如,在第一次加载时),列表没有更新。我在ContentObserver
上注册了一个,当我打电话给它时Cursor
它被击中;只是我从原始负载中存储的计数仍然为零。notifyChange(...)
ContentProvider
Cursor
回调和ContentObserver
看起来像这样:
private LoaderCallbacks<Cursor> mCallbacks = new LoaderCallbacks<Cursor>() {
public void onLoaderReset(Loader<Cursor> loader) {
mLoaderCreated = false;
mCursor.unregisterContentObserver(mObserver);
mCursor = null;
}
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if(cursor!=mCursor) {
if(mCursor!=null)
mCursor.unregisterContentObserver(mObserver);
cursor.registerContentObserver(mObserver);
mCursor = cursor;
if(cursor.isClosed()) {
getLoaderManager().restartLoader(mFragmentId, null, mCallbacks);
return;
}
}
mDataModel.populate(cursor);
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
mLoaderCreated = true;
triggerServicesFeed();
CursorLoader cursorLoader = null;
if(id == mFragmentId) {
cursorLoader = new CursorLoader(getActivity(),
FerrariVertuContentProvider.SERVICES_URI,
null, null, null,null);
}
return cursorLoader;
}
};
private ContentObserver mObserver = new ContentObserver(null) {
public void onChange(boolean selfChange, android.net.Uri uri) {
onChange(selfChange);
};
public void onChange(boolean selfChange) {
if(mCursor.isClosed()) {
mCursor.unregisterContentObserver(this);
mCursor = null;
} else {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//mCursor still reports zero on first run
mDataModel.populate(mCursor);
}
});
}
};
};
我只知道CursorAdapter
更新时会Cursor
更新,而且我会在我期望的时候收到更新事件,这让我认为流程的这个阶段至少是有效的。我如何才能mCursor
给我新数据,或者获得Cursor
代表新数据的新数据?