2013-02-26 32 views
0

我有通过CursorLoader填充的listview。 CursorLoader由LoaderManager.LoaderCallback的createLoader方法创建。我对此没有任何问题。问题在于我想在listview填充完成时开始另一项任务,并使用其他数据填充列表视图。 我目前的解决方案是在onLoadFinished方法中启动另一个加载器。从另一个加载程序启动加载程序。对还是错?

这是正确的解决方案还是可以以更优雅高效的方式完成?你可以给一些建议,因为我没有太多的android开发经验。 在此先感谢。

+0

为什么首先需要2次调用来获取数据?启动第二个加载程序的触发器是什么?它是否会显示更多数据的某种列表项单击? – Sean 2013-02-26 19:12:25

+0

我可以看到,您只想为列表视图中的可见项目执行此操作。但是,如果您在初始列表数据之后立即加载所有项目的附加数据,那么只需在同一个加载程序中一步完成。 – 2013-02-26 19:12:52

+0

@Sean事情是,我第一次负载收集通话记录,并在第二我收集每个电话号码的其他信息,如地点 – Azat 2013-02-26 19:35:09

回答

3

onLoadFinished加载将无任何问题。我在一个宠物项目中做了类似的事情。我从我自己的ContentProvider加载数据,然后从手机的Contact ContentProvider加载联系人数据。我的数据库中的每个条目都可以引用多个联系人,所以我必须先加载我的项目,然后才能知道要加载的联系信息。当我第一次收到onLoadFinished中的项目数据时,我将init/restart LoaderManager调用链接起来。它工作得很好,我之后使用联系人数据作为列表。当然,我没有使用这种方法将数据加载到现有列表视图项目的视图中。我在我的物品的详细视图中使用了自己列表中的数据。它应该仍然可以处理你想要做的事情,但是它可能会混乱地将数据附加到视图和内容,特别是因为视图“生命周期”不在你的控制范围之内。

一个更好的方法IMO可能会编写一个自定义的CursorAdapter,它可以在创建视图时使用AsyncTask或AsyncQueryHandler来获取额外的数据。确保在列表滚动时缓存数据供随后使用。第二种方法具有独立于外部/辅助装载机的优点。它封装了显示所需数据所需的所有逻辑,其中包括加载缺少的部分。它保持视图数据和显示逻辑的一致性,安全地隐藏在可重用模块内。

+0

感谢您的回复,所以在第二种方法中,列表中的每一行都会有一个新的异步任务?如果是这样,它会不会影响低端设备的性能? – Azat 2013-02-27 07:36:59

+0

我提到AsyncTask作为例子。如果你的加载任务相对较短(几秒钟),那么它应该不成问题。而且,就像我之前说过的那样,缓存结果,以便每次滚动视图时都不需要获取结果。如果您的任务需要更多时间来完成或执行更长的操作,则应考虑使用[ThreadPoolExecutor](http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html)。它们提供了一个更高效和可控的多线程解决方案,并且可以非常有用地检查线程。 – ebarrenechea 2013-02-27 14:20:27