2

我很难正确实施装载机。我阅读了很多文章和 stackoverflow 帖子,并尝试了各种方法。但是还没有解决这个问题。我正在使用带有 PagerSlidingTabStrip 库的 viewpager 来创建 3 个选项卡布局(使用 FragmentPagerAdapter)。我正在使用 3 个单独的加载器来加载这 3 个选项卡的数据。

问题是,当我第一次加载我的应用程序时,即使 FragmentPagerAdapter 成功创建了相邻的片段,相邻的选项卡也不会调用 loadInBackground() 直到我滚动到这些选项卡。奇怪的是,一旦我旋转或按下 home 并再次打开应用程序,相邻的选项卡就会开始加载。这意味着如果视图被销毁并重新创建,则加载开始。

我还尝试对所有 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