4

我有一个带有 ViewPager 和 FragmentPagerAdapter 的 FragmentActivity。

ViewPager 中的每个片段都需要从 Web 服务加载数据。我已经编写了 LoaderManager/custom Loaders 来执行 web 服务调用、解析 XML 等,这些都工作正常。

管理加载和片段有两种可能的设计。

1) 代表片段管理加载的主要活动。

片段调用主 FragmentActivity 请求它的数据。该活动检查该数据的加载器是否已经在运行,如果没有,它会创建一个并执行加载。

在这种情况下,我如何告诉片段数据已加载并准备好进行绘制。我使用的是自定义加载器而不是简单游标,因此片段将从对象实例填充其文本视图等,因此必须在填充对象时告知它。

当您在 getItem 中实例化片段时,FragmentPagerAdapter 似乎不允许您将标签或 Id 分配给片段。如何从 FragmentActivity 中找到片段并告诉它绘制数据?

2)每个片段管理自己的加载。

片段初始化自己的加载器,每个片段都有自己的 onCreateLoader/onLoaderFinish 等。

我在这里遇到的问题是,如果在加载程序运行片段时用户页面离开该页面似乎被破坏(有时)。因此,onLoaderFinished 没有被调用,并且片段无法告诉主要活动它已完成 - 主要活动正在控制操作栏中的进度指示器 (setProgressBarIndeterminateVisibility)。

那么,当您有一个 FragmentPagerAdapter、一个包含多个需要自己的加载器的页面的 ViewPager 时,最好的设计模式是什么?

我遇到的另一个问题是使用 getSupportLoaderManager 来检查是否有任何加载器正在运行。我从 onLoadFinished 中调用它。如果没有加载程序运行,我可以隐藏进度指示器。然而,hasRunningLoaders 有时会返回 true,即使所有加载程序都已完成。

        LoaderManager lm = getSupportLoaderManager();

    // If the loader is not already running, start it...
    if (! lm.hasRunningLoaders()) {
        setProgressBarIndeterminateVisibility(Boolean.FALSE);
    }

非常感谢您的任何建议或为我指明一些不错的样品的方向。

塔马丁。

4

2 回答 2

0

关于设计 1,我通过维护我创建的片段的引用变量来完成类似的操作。在 FragmentPagerAdapter 的 getItem 方法中,您可以在返回之前将创建的片段分配给该变量。这将允许从主要活动访问您的片段。

于 2012-01-20T14:08:38.540 回答
0

我不确定这是否完全正确,但我记得当加载程序在后台获取数据时销毁 Fragment 时,onLoaderReset会调用该方法(而不是onLoaderFinished)。这将允许您适当地重置进度指示器。

于 2013-02-25T23:16:54.990 回答