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