0

我有一个非常简单CursorLoader的加载一个Cursor. 我将光标存储为我的活动中的一个字段。(所以不在一个CursorAdapter!)

    public static class BundlesLoader extends CursorLoader {
        public static final String[] PROJECTION = new String[]{
                BaseColumns._ID,
                TITLE,
                SUBTITLE,
                DESCRIPTION
        };

        public BundlesLoader(Context ctx) {
            super(
                    ctx,
                    URI_BUNDLES,
                    PROJECTION,
                    null,
                    null,
                    POSITION + " ASC"
            );
        }
    }

当我打电话时ContentResolver.notifyChange(URI_BUNDLES, null),我希望 CursorLoader 重新加载,但事实并非如此。(见LoaderCallbacks下文;我记录回调。)

为了调试这个问题,我注册了一点ContentObserver,它确实有效,奇怪的是:

      getContentResolver().registerContentObserver(LegislationProvider.URI_BUNDLES,
            false, new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange) {
            Log.e("hello", "bundles changed!!!!!");
        }

        @Override
        public void onChange(boolean selfChange, Uri uri) {
            onChange(selfChange);
        }
    });

所以知道我不知道如何从这里调试。我的CursorLoader初始化没问题,我的ContentObserver作品,但由于某种原因,CursorLoader当底层数据库发生变化时,它不会重新加载光标。有什么问题?


这是我的LoaderCallbacks

    @Override
    public android.support.v4.content.Loader onCreateLoader(int id, Bundle bundle) {
        switch (id) {
            case LoaderIds.LOADER_BUNDLES:
                d("Creating new bundles loader");
                return new Model.Bundle.Loader(getApplicationContext());
            default:
                throw new IllegalArgumentException(
                        "Could not handle loader id " + id);
        }
    }

    @Override
    public void onLoadFinished(android.support.v4.content.Loader loader, Cursor cursor) {
        switch (loader.getId()) {
            case LoaderIds.LOADER_BUNDLES:
                d("onLoadFinished: Bundles loaded with "
                        + cursor.getCount() + " elements");
                mMasterFragment.setBundlesCursor(cursor);
                break;
            default:
                throw new IllegalArgumentException(
                        "Could not handle loader id " + loader.getId());
        }
    }

    @Override
    public void onLoaderReset(android.support.v4.content.Loader loader) {
        switch (loader.getId()) {
            case LoaderIds.LOADER_BUNDLES:
                d("onLoaderReset: Clearing collection adapter");
                mMasterFragment.setBundlesCursor(null);
                break;
            default:
                throw new IllegalArgumentException(
                        "Could not handle loader id " + loader.getId());
        }
    }
4

1 回答 1

1

setNotificationUri(getContentResolver(), URI_BUNDLES)即使您使用的是CursorLoader. 从你的问题中我不知道你是否这样做。

于 2013-12-27T21:42:48.507 回答