Android 带有加载程序和EndlessCursorAdapter的ListFragment-噩梦

Android 带有加载程序和EndlessCursorAdapter的ListFragment-噩梦,android,android-fragments,android-asynctask,commonsware-cwac,Android,Android Fragments,Android Asynctask,Commonsware Cwac,我将从我正在努力完成的事情开始 我有一个ListFragment,与LoaderCallbacks关联以从数据库检索数据。使用AsyncTask下载数据,并将其插入数据库。当用户到达列表底部时,使用CWAC无止境小部件启动AsyncTask并下载更多数据 我在这里面临着几个问题,我花了好几个晚上试图解决这个问题,我决定来这里寻求帮助 第一个问题是配置更改。当用户旋转设备时,活动将被销毁,然后重新创建所有片段。我知道我可以使用setRetainInstance设置为true,但这并没有帮助,因为当

我将从我正在努力完成的事情开始

我有一个ListFragment,与LoaderCallbacks关联以从数据库检索数据。使用AsyncTask下载数据,并将其插入数据库。当用户到达列表底部时,使用CWAC无止境小部件启动AsyncTask并下载更多数据

我在这里面临着几个问题,我花了好几个晚上试图解决这个问题,我决定来这里寻求帮助

第一个问题是配置更改。当用户旋转设备时,活动将被销毁,然后重新创建所有片段。我知道我可以使用setRetainInstance设置为true,但这并没有帮助,因为当活动被拆除时,AsyncTask仍在运行

第二个问题与加载程序有关。如果下载了数据,并且AsyncTask完成得很好,那么这些项目将显示在fine列表中。假设数据库中有20个项目。当用户旋转设备并重新创建片段时,需要再次关联加载程序。发生这种情况时,数据不会立即加载到列表中,而是启动下载的AsyncTask,因为CWAC无尽适配器认为它位于列表中的最后一项

这两个问题都让我筋疲力尽。我需要对这件事有一个新的认识,因为我不知道该怎么办

任何建议都可以,如果需要,我可以发布源代码

编辑

好的,这里有更多的细节来帮助你提出一些建议

我从互联网上下载数据,一次只能返回一定数量的项目。然后,我必须在需要时请求更多数据(分页)

我决定使用一个数据库,因为新的加载器功能使它非常简单,可以确保数据的加载效率和一致性,而不会出现任何线程问题。 如果放弃加载器方法并使用标准适配器渲染数据是有意义的,我非常乐意放弃这种方法并使用它。我只是想看看是否有人能洞察为什么这个解决方案如此困难

谢谢

亚当

当用户到达列表底部时,使用CWAC无止境小部件启动AsyncTask并下载更多数据

FWIW,我还没有尝试过使用这种组合(游标、加载程序和
AsyncTask
)的
EndlessAdapter
。特别是引用文件:

请注意,这已经用
ArrayAdapter
进行了大量测试,但可能不适用于其他适配器类型

我甚至不太确定应用于本地数据库的
EndlessAdapter
的用例是什么。如果你有一个疯狂的长列表(例如,数千行),答案不是“逐步加载”,而是“提供不同的用户体验以避免长列表”。对于较短的列表,只需加载整个内容并完成即可
EndlessAdapter
适用于加载费用昂贵的情况(例如,互联网访问)

这就是说,我将把“玩
EndlessAdapter
Loader
”添加到我的待办事项列表中

我知道我可以使用setRetainInstance设置为true,但这并没有帮助,因为当活动被拆除时,AsyncTask仍在运行

那么<在新活动通过
onCreate()
之前,不会调用code>onPostExecute()。此外,在基于片段的模型中,您的任务应该与片段对话,如果通过
setRetainInstance(true)
保留该片段,则新旧活动中都是相同的片段实例

发生这种情况时,数据不会立即加载到列表中

应该相当快地加载它,尽管是异步加载。此外,我不明白为什么这与最初创建活动时有什么不同

相反,下载的AsyncTask被启动,因为CWAC无止境适配器认为它位于列表中的最后一项

在获得数据之前,不应创建
EndlessAdapter

当用户到达列表底部时,使用CWAC无止境小部件启动AsyncTask并下载更多数据

FWIW,我还没有尝试过使用这种组合(游标、加载程序和
AsyncTask
)的
EndlessAdapter
。特别是引用文件:

请注意,这已经用
ArrayAdapter
进行了大量测试,但可能不适用于其他适配器类型

我甚至不太确定应用于本地数据库的
EndlessAdapter
的用例是什么。如果你有一个疯狂的长列表(例如,数千行),答案不是“逐步加载”,而是“提供不同的用户体验以避免长列表”。对于较短的列表,只需加载整个内容并完成即可
EndlessAdapter
适用于加载费用昂贵的情况(例如,互联网访问)

这就是说,我将把“玩
EndlessAdapter
Loader
”添加到我的待办事项列表中

我知道我可以使用setRetainInstance设置为true,但这并没有帮助,因为当活动被拆除时,AsyncTask仍在运行

那么<在新活动通过
onCreate()
之前,不会调用code>onPostExecute()。此外,在基于片段的模型中,您的任务应该与片段对话,如果通过
setRetainInstance(true)
保留该片段,则新旧活动中都是相同的片段实例

发生这种情况时,数据不会立即加载到列表中

应该相当快地加载它,尽管是异步加载。此外,我不明白为什么这与最初创建活动时有什么不同

相反,下载的异步任务被启动,因为