不会调用onLoadFinished(),但是会调用onCreateLoader()

时间:2019-04-04 00:33:40

标签: fragmentpageradapter android-cursorloader android-loadermanager

我正在使用 CursorLoader 从我的Fragment(具有 RecyclerView )中的数据库加载数据。该片段正在ViewPager中使用。 ViewPager 包含在ContainerFragment内,而ContainerFragment则在Activity内。

ContainerFragment初始化onActivityCreated()中所需的10个加载器中的前4个。从日志中,我可以看到实际上已创建了加载器。但是,没有onLoadFinished被任何装载程序调用。

现在,当我在ViewPager中滑动到第三个片段时,就会出现这种扭曲。现在,我看到第三个加载器的onLoadFinished被调用。现在,这可能不是从片段中调用的,而是从PagerAdapter的getItem()方法中调用的,该方法除了实例化片段之外,还可以使用其ID初始化加载器(如果尚未加载的话)。

从StackOverflow上关于onLoadFinished未被调用的所有其他问题,我尝试了以下对我不起作用的解决方案:

  1. 使用forceLoad()
  2. this.getListView().refreshDrawableState();->尚未尝试,并且不明白为什么应该这样做。而且,我正在使用RecyclerView。
  3. “导入正确的类”->我正在使用AndroidX,而且,加载程序有时确实会加载。如果这是错误的课程,那么它在任何时候都不会奏效吗?
  4. “片段应使用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的情况下填充光标。

0 个答案:

没有答案