我正在使用 CursorLoader 从我的Fragment(具有 RecyclerView )中的数据库加载数据。该片段正在ViewPager中使用。 ViewPager 包含在ContainerFragment内,而ContainerFragment则在Activity内。
ContainerFragment初始化onActivityCreated()
中所需的10个加载器中的前4个。从日志中,我可以看到实际上已创建了加载器。但是,没有onLoadFinished
被任何装载程序调用。
现在,当我在ViewPager中滑动到第三个片段时,就会出现这种扭曲。现在,我看到第三个加载器的onLoadFinished
被调用。现在,这可能不是从片段中调用的,而是从PagerAdapter的getItem()
方法中调用的,该方法除了实例化片段之外,还可以使用其ID初始化加载器(如果尚未加载的话)。
从StackOverflow上关于onLoadFinished未被调用的所有其他问题,我尝试了以下对我不起作用的解决方案:
forceLoad()
this.getListView().refreshDrawableState();
->尚未尝试,并且不明白为什么应该这样做。而且,我正在使用RecyclerView。SupportLoaderManager
”->尝试用getActivity().getSupportLoaderManager
替换片段。对于片段,我认为它只是getLoaderManager
。有时仅使用getLoaderManager
就可以了。 (未观察到差异) #onActivityCreated
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
startLoaders();
}
startLoaders()
private void startLoaders() {
while(loaderSeqIndex < CATEGORIES.size() && loaderSeqIndex < 4) {
Bundle bundle = new Bundle();
bundle.putString("category", CATEGORIES.get(loaderSeqIndex));
getLoaderManager().initLoader(loaderSeqIndex++, bundle, this);
}
}
LoaderCallbacks
@NonNull
@Override
public Loader<Cursor> onCreateLoader(int id, @Nullable Bundle args) {
Timber.i("Loader created onCreateLoader called");
CursorLoader loader = ArticleLoader.newCategorizedArticlesInstance(getContext(), args.getString("category"));
loader.registerListener(id, new Loader.OnLoadCompleteListener<Cursor>() {
@Override
public void onLoadComplete(Loader<Cursor> loader, Cursor data) {
int position = loader.getId();
cursorHashMap.put(CATEGORIES.get(position), data);
Timber.i("mPager.getCurrentItem(): " + mPager.getCurrentItem() + " position: " + position);
if (position == mPager.getCurrentItem()) {
ArticleListViewModel model = ViewModelProviders.of(ArticleListContainerFragment.this).get(ArticleListViewModel.class);
model.setCursor(data);
}
}
});
return loader;
}
@Override
public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor data) {
int position = loader.getId();
cursorHashMap.put(CATEGORIES.get(position), data);
Timber.i("mPager.getCurrentItem(): " + mPager.getCurrentItem() + " position: " + position);
if(position == mPager.getCurrentItem()) {
ArticleListViewModel model = ViewModelProviders.of(this).get(ArticleListViewModel.class);
model.setCursor(data);
// mPagerAdapter.notifyDataSetChanged();
}
}
PagerAdapter的#getView
private class MyPagerAdapter extends FragmentStatePagerAdapter {
...
@Override
public Fragment getItem(int position) {
ArticleListFragment fragment = ArticleListFragment.newInstance();
Bundle bundle = new Bundle();
bundle.putString("category", CATEGORIES.get(position));
bundle.putInt("id",position);
fragment.setArguments(bundle);
// fragment.setCursor(cursorHashMap.get(CATEGORIES.get(position)));
return fragment;
}
...
}
我希望从#onLoadFinished
方法打印木材只是为了确保它被调用,而这没有发生。
正在发生的事情很奇怪:
我正在使用的cursorHashMap
正确填充了,我第二次打开了应用程序(当刷新没有发生时)。并且会在没有调用#onLoadFinished
的情况下填充光标。