コメントのリストを読み込んで表示するためにCursorAdapter
を使用しています。ListFragment
public class CommentsFragment extends ListFragment implements LoaderCallbacks<Cursor> {
protected Activity mActivity;
protected CursorAdapter mAdapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mActivity = getActivity();
mAdapter = new CommentsCursorAdapter(mActivity, null, 0);
setListAdapter(mAdapter);
mActivity.getContentResolver().registerContentObserver(CustomContract.Comments.CONTENT_URI, false, new CommentsObserver());
getLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle extras) {
Uri uri = CustomContract.Comments.CONTENT_URI;
return new CursorLoader(mActivity, uri, null, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
mAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
protected class CommentsObserver extends ContentObserver {
public CommentsObserver() {
super(new Handler());
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// TODO Trigger a reload.
}
}
}
関連する ContentProviderで、挿入アクションnotifyChange()
用に追加しました。
@Override
public Uri insert(Uri uri, ContentValues values) {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int match = sUriMatcher.match(uri);
switch (match) {
case COMMENTS: {
long id = db.insert(DatabaseProperties.TABLE_NAME_COMMENTS, null, values);
Uri itemUri = ContentUris.withAppendedId(uri, id);
// FIXME Which one is right?
getContext().getContentResolver().notifyChange(itemUri, null);
getContext().getContentResolver().notifyChange(uri, null);
return itemUri;
}
default: {
throw new UnsupportedOperationException("Unknown URI: " + uri);
}
}
}
質問:
- にオブザーバーのパラメータとして渡し
null
てもよろしいでしょうか?notifyChange()
そうでない場合、ここでどのオブジェクトを渡す必要がありますか? uri
またはを渡す必要がitemUri
ありnotifyChange()
ますか? なんで?CommentsObserver#onChange()
コメントのリストを更新するには、どのメソッドを呼び出す必要がありますか?ListFragment
の内部クラス インスタンスの代わりに実装できるインターフェイスはありませんContentObserver
か?new Handler()
のコンストラクターでa をインスタンス化するだけですCommentsObserver
。これは私には正しくないようです - 説明してください。