0

私はImageDownloaderで非常に単純なCursorLoaderを使用しています。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というラベルの付いた行は、次のように、カーソルを取得するメソッドにすぎません。

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であり、そのカーソルが返されるときに完全であると見なされます。これは正しいことです。私の理解では、setAdapter()メソッドは、実際にgetViewメソッドをトリガーするものです

私が抱えている問題は、すべてが正常に実行されているように見えることです。ログ出力は画像のURLを正しく出力し、ブレークポイントはすべて正当なデータを示していますが、問題は、グリッドビューが画像で更新されないことです。 ImageDownloaderが取得します。

編集 これはSimpleCursorLoader私が使用しているものです:https ://gist.github.com/1217628

4

2 に答える 2

0

繰り返しになりますが、問題はFragment、親からのローダーを管理している可能性が高いですActivityActivityとライフサイクルは互いに同期していません(Fragment少なくとも予測可能な方法ではありません)。そのため、問題をデバッグしようとしても、実際にはどこにも行き着きません。LoaderManager予測可能な動作を保証する最も簡単な方法は、 (Fragmentsにアクセスするのではなく)各コンポーネントに独自のコンポーネントを使用させることgetActivity().getSupportLoaderManager()です。

于 2012-07-24T17:42:10.160 に答える
0

私の別の質問と同様に、更新を強制するべきではありません。プロバイダーを使用する場合は、プロバイダーに更新をcontentresovlerに通知させることができます。新しい写真を挿入するメソッドがあり、そのメソッドはデータプロバイダーを使用します。データプロバイダーは

getContext().getContentResolver().notifyChange(uri, null);

実際にカーソルを更新します。

于 2012-09-26T16:31:52.757 に答える