1

我正在编写一个Fragment使用加载器来获取Cursor有关地图上各种事物位置的包含数据的代码。我继承了代码,按与设备或搜索位置的距离对这些位置进行排序;距离度量并不是在 SQL 中特别容易实现的东西,所以CursorAdapter我不是使用(和其他地方一样)从 中加载数据Cursor,然后再对其进行排序。

我只有一个问题:当 Web 服务返回一组新的位置时(例如,在第一次加载时),列表没有更新。我在ContentObserver上注册了一个,当我打电话给它时Cursor击中;只是我从原始负载中存储的计数仍然为零。notifyChange(...)ContentProviderCursor

回调和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代表新数据的新数据?

4

0 回答 0