2

ローダーを適切に実装するのに苦労しています。たくさんの記事やstackoverflowの投稿を読んで、いろいろ試してみました。しかし、この問題を解決したものはまだありません。PagerSlidingTabStrip ライブラリでビューページャーを使用して、3 つのタブ レイアウトを作成しています (FragmentPagerAdapter を使用)。そして、これら 3 つのタブのデータをロードするために 3 つの個別のローダーを使用しています。

問題は、アプリを最初にロードしたときに、 FragmentPagerAdapter が隣接するフラグメントを正常に作成しても、それらのタブにスクロールするまで、隣接するタブが loadInBackground() を呼び出さないことです。不思議なことに、回転するかホームを押してアプリを再度開くと、隣接するタブの読み込みが開始されます。これは、ビューが破棄されて再作成されると、読み込みが開始されることを意味します。

また、3 つのフラグメントすべてのローダーに startLoading を使用してみました (OnStartLoading メソッドが適切に構成されていると思います。そのメソッドで forceLoad() を呼び出しています)。startLoading を使用すると、loadInBackground() が呼び出されます。それでも、onLoadFinished() はそうではありません! そのため、隣接するタブに移動するまで、ビューには空の回転ローダーが表示されたままです。

つまり、loadInBackground() が呼び出されるかどうかに関係なく、隣接するページの onLoadFinished() は、ビューが再作成されるまで呼び出されません。(またはもちろん、単にそれらのページに移動した場合)

誰もが同様の問題に遭遇しますか? できる限りのことを試したような気がしますが、この問題をどのように進めればよいかわかりません。

ここに私の onCreateView() があります:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View v = inflater.inflate(R.layout.movie_grid, container, false);

    LoaderManager lm = getLoaderManager();
    lm.restartLoader(CONFIG_LOADER, null, new ConfigurationLoaderCallbacks());
    lm.restartLoader(MOVIE_DATA_LOADER, null, new MovieDataLoaderCallbacks());

    ...           

    return v;
}

私の抽象的な AsyncTaskLoader クラス:

private D mData;

public DataLoader(Context context) {
    super(context);
}

@Override
protected void onStartLoading() {
    if (mData != null) {
        deliverResult(mData);
    } else {
        forceLoad();
    }
}

@Override
public void deliverResult(D data) {
    mData = data;
    if (isStarted())
        super.deliverResult(data);
}

私の onResume():

public void onResume() {
    super.onResume();

    // Call this to re-connect with an existing loader
    LoaderManager lm = getLoaderManager();
    if (lm.getLoader(MOVIE_DATA_LOADER) != null) {
        lm.initLoader(MOVIE_DATA_LOADER, null, new MovieDataLoaderCallbacks());
    }
    if (lm.getLoader(CONFIG_LOADER) != null) {
        lm.initLoader(CONFIG_LOADER, null, new ConfigurationLoaderCallbacks());
    }
}
4

0 に答える 0