ローダーを適切に実装するのに苦労しています。たくさんの記事や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());
}
}