Android使用CursorLoader组合ImageDownload

时间:2012-06-25 01:39:15

标签: android android-gridview android-loadermanager android-cursor android-loader

我正在使用一个非常简单的CursorLoader和一个ImageDownloader。 ImageDownloader正在运行,除CursorLoader之外的所有内容都已完成,然后ImageDownloader开始下载图像,但GridView没有使用下载的图像进行更新..

在我的ListFragment中,我有以下 onActivityCreated 方法:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    Log.d(TAG, "onActivityCreated");

    super.onActivityCreated(savedInstanceState);

    cursorAdapter = new OURSVPImageAdapter(getActivity(), null);

    // set the adapter on the gridview
    mGridView.setAdapter(cursorAdapter);

    // load the data
    getActivity().getSupportLoaderManager().initLoader(2, null, this);
}

我的CursorLoader如下:

public static final class PhotoCursorLoader extends SimpleCursorLoader {

    Context mContext;

    public PhotoCursorLoader(Context context) {
        super(context);

        Log.d("PhotoCursorLoader", "Constructor");

        mContext = context;
    }

    @Override
    public Cursor loadInBackground() {
        Log.d("PhotoCursorLoader", "loadInBackground");

        PhotosDataSource datasource = new PhotosDataSource(mContext);

        # STEP 1
        return datasource.getAllPhotos(((EventActivity) mContext).getEventId());
    }

}

标记为 #STEP 1 的行检索所有照片只是一种检索Cursor的方法,如下所示:

public Cursor getAllPhotos(long event_id) {
    Log.d(TAG, "getAllPhotos");

    Cursor mCursor = getWritableDatabase().query(true, TABLE_NAME, COLUMNS_PHOTOS, DatabaseConstants.KEY_EVENT_ID + "=" + event_id, 
            null, null, null, null, null);

    return mCursor; 
}

因此,这是ListFragment的CursorLoader,它假定在返回Cursor时完成,这是正确的。根据我的理解, setAdapter()方法实际上会触发 getView 方法。

我遇到的麻烦是,一切似乎运行正常,我的日志输出正确输出图像的网址,断点都显示合法数据,问题但是,我的网格视图永远不会得到使用ImageDownloader检索的图像进行更新。

修改 这是我使用的SimpleCursorLoaderhttps://gist.github.com/1217628

2 个答案:

答案 0 :(得分:0)

问题很可能是您从父Fragment管理Activity的加载程序。 ActivityFragment生命周期不会彼此同步(至少不是以可预测的方式),因此您调试问题的尝试实际上并没有让您到任何地方。保证可预测行为的最简单方法是让每个单独的组件都使用自己的LoaderManager(而不是让Fragment访问getActivity().getSupportLoaderManager())。

答案 1 :(得分:0)

与我的另一个问题一样......不应强制刷新,并且在使用提供程序时,您可以让提供程序通知contentresovler更新。我有一个插入新照片的方法,该方法使用数据提供程序。

需要数据提供者
getContext().getContentResolver().notifyChange(uri, null);

实际更新光标。