我正在编写一个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
?