Fragmentローダーを使用しCursorて、マップ上のさまざまな物の位置に関するデータを含む を作成しています。これらの場所をデバイスからの距離または検索場所からの距離で並べ替えるコードを継承しました。距離メトリックは、SQL で実装するのが特に簡単なものではないため、(他の場所のように) を使用するのではなく、CursorAdapterからデータを一度ロードしてから、Cursor後で並べ替えています。
1 つだけ問題があります。Web サービスが新しい場所のセットを返すとき (たとえば、最初の読み込み時)、リストが更新されません。に を登録しContentObserverましたがCursor、を呼び出すとヒットしnotifyChange(...)ますContentProvider。元のロードから保存したCursorI のカウントがまだゼロであることだけです。
コールバックとは次の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ですか?