gpt4 book ai didi

android - 如何使用 CursorAdapter 和 LoaderCallbacks 在 fragment 中实现 ContentObserver?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:50:36 24 4
gpt4 key购买 nike

我在 ListFragment 中使用 CursorAdapter 来加载和显示评论列表。

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 中,我为 insert 操作添加了 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);
}
}
}

问题:

  1. 可以将null 作为观察者参数传递给notifyChange() 吗?如果不是,我应该在这里传递什么对象?
  2. 我应该在 notifyChange() 中传递 uri 还是 itemUri?为什么?
  3. 我必须在 CommentsObserver#onChange() 中调用什么方法来更新评论列表?
  4. 是否没有可以使用 ListFragment 而不是 ContentObserver 的内部类实例来实现的接口(interface)?
  5. 我只是在 CommentsObserver 的构造函数中实例化了一个 new Handler()。这对我来说似乎不正确 - 请解释。

最佳答案

SqlCursor 已经有内部 ContentObserver 并且由于您正在使用此 Cursor 实现,因此不需要自己的 ContentObserver 实现。

为了方便使用,您可以添加:

class MyContentProvider extends ContentProvider{
//rest implementation goes here
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor cursor = null;
//check uri, select table name based on uri, etc ...
cursor = db.query(/*.....*/);
//add this line:
cursor.setNotificationUri(getContext().getContentResolver(), uri);
//before you return cursor
return cursor;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
/* ... */
//you can notify only "dir" uri and is should be enough
getContext().getContentResolver().notifyChange(uri, null);
return itemUri;
/* ... */
}
//rest of implementation goes here
}

在此之后,CursorLoader 内部实现将负责重新加载/刷新数据......

关于android - 如何使用 CursorAdapter 和 LoaderCallbacks 在 fragment 中实现 ContentObserver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11984656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com