使用LoaderManager的Android FragmentPagerAdapter

5
我有一个FragmentActivity,其中包含一个ViewPager和一个FragmentPagerAdapter。
ViewPager中的每个片段都需要从Web服务加载数据。我已经编写了LoaderManager/自定义加载器来执行Web服务调用、解析XML等,这些工作都很好。
管理加载和片段有两种可能的设计方案。
1)主活动代表片段进行加载。
片段回调到主FragmentActivity请求其数据。如果没有正在运行的loader,则该活动将创建一个loader并执行加载。
在这种情况下,如何告诉片段数据已加载并准备好进行呈现?我使用的是自定义加载器而不是简单的游标,因此片段将从一个对象实例填充它的文本视图等,所以必须在对象被填充时通知它。
似乎FragmentPagerAdapter不允许在getItem中实例化片段时分配标签或ID。我怎么找到片段并告诉它绘制它的数据?
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);
    }

非常感谢您提供的建议或指向一些不错的样例。
谢谢, 马丁。
2个回答

0

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


0
关于设计1,我通过保留对所创建的片段的引用变量来做出了类似的事情。在FragmentPagerAdapter的getItem方法中,您可以将创建的片段分配给该变量,然后再返回它。这将允许从主活动访问您的片段。

谢谢,我认为如果FragmentPagerAdapter在用户翻页时释放了一个片段,您需要通过覆盖destroyItem来删除引用。然后,在再次调用getItem时,重新添加对新创建片段的引用。遗憾的是,FragmentPagerAdapter不支持查找它正在管理的片段。我有两种想法,一种是让每个片段都相当简单,只知道如何显示它所给出的数据,另一种是让每个片段知道如何加载自己的数据,哪种更好还需斟酌。 - MartinS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接