【问题标题】:Android FragmentPagerAdapter with LoaderManagerAndroid FragmentPagerAdapter 与 LoaderManager
【发布时间】:2012-01-20 12:57:40
【问题描述】:

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

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

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

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

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

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

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

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

fragment初始化自己的Loader,每个fragment都有自己的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);
    }

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

Ta 马丁。

【问题讨论】:

    标签: android android-fragments android-viewpager android-loadermanager


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我假设如果 FragmentPagerAdapter 在用户分页到另一个片段时释放片段,则您必须通过覆盖 destroyItem 来删除引用。然后在再次调用 getItem 时重新添加对新创建的片段的新引用。 Shame FragmentPagerAdapter 不支持查找它正在管理的片段。我有两种想法,是让每个片段都相当愚蠢并且只知道如何显示它给出的数据更好,还是让每个片段知道如何加载自己的数据更好。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-16
      • 2011-08-28
      • 2012-03-10
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多