问题标签 [android-loader]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Android 自定义 Loader,LoaderManagerImpl.LoaderInfo.callOnLoadFinished 只调用一次
我正在尝试实现我自己的自定义 Android加载器,以便能够在我的应用程序中使用LoaderManager的好处(将加载数据与我的活动和片段的生命周期解耦)。
我首先考虑了AsyncLoader的子类化,但我并不真的需要将数据加载到AsyncTask上(这就是 AsyncLoader 在后台所做的)。在我的案例中,基础数据是/是来自本机库的数据/样本。这些示例在库中兑现,这与我的应用程序完全异步,因此无需在单独的线程中迭代此本机缓存。
这或多或少是我的自定义加载器的样子:
我正在使用Fragment通过ArrayAdapter显示我的本地日期样本:
ADB Logcat 跟踪:
现在的问题是,我的Loader已正确通知数据更改,但仅在第一次将它们正确传递给LoaderManager.LoaderCallbacks onLoadFinished()回调时。在方向改变之后,情况相同,第一次结果正确到达onLoadFinished(),但来自本机层的后续更新没有到达片段。
我使用 eclipse 调试功能来追踪问题,并在LoaderManager源代码中找到了它(第 447-453 行:此代码是从 Loader.deliverResult => onLoadComplete [=> callOnLoadFinished => fragment update OK] 中触发的):
似乎只有第一次mData != data(因为mData == null在这种情况下)。在此条件的后续命中中,mData == data始终(并且数据对象/数组随着我的本机输入正确增长),这很奇怪,因为我无法找出谁在LoaderInfo类中设置/更新此 mData 对象LoaderManagerImpl。_
这个问题阻碍了我,因为只有当这个条件为真时,才会完成对callOnLoadFinished的必要调用,这将正确地通知我的片段和 arrayAdapter 底层更改。
任何人都知道我在自定义加载器中做错了什么,或者当底层数据集一直在变化时,自定义加载器不是一个很好的解决方案?
提前致谢!巴特
Android 自定义加载器的良好参考: http ://www.androiddesignpatterns.com/2012/08/implementing-loaders.html
android - CursorAdapter 如何从 Android 中 CursorLoader 提供的 Cursor 加载数据?
我已经实现了以下代码以将联系人显示为ListView
. MyAdapter
延伸CursorAdapter
。
我想知道的是,adapter
-怎么mAdapter
知道它必须从(调用后可用)cursor
提供的数据中选择数据?CursorLoader
Cursor
onCreateLoader
android - 使用 Loader 恢复 Android 片段
我有一个带有列表的片段(YearsFragment)。如果我单击一个项目,则会执行一个新片段(EventsFragment)。
新片段的加载器加载一个新列表。这行得通。
现在我的问题:当我回到第一个 YearsFragment 并单击同一项目时,EventsFragment 再次加载。但我会用旧数据获取旧加载器。
活动活动:
岁月片段:
事件片段:
我应该怎么做简历?
问候Mr.P。
android - Android:AutoCompleteTextView 与 SQlite 的哪个适配器?
我有一个旧应用程序,它使用AutoCompleteTextView通过SimpleCursorAdapter从SQlite数据库过滤数据(大约 3000 个项目)。
它工作得很好,而且速度很快。
但是,我刚刚意识到它SimpleCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to)
已被弃用。
文档说建议使用“带有 CursorLoader 的 LoaderManager ”。但是,LoaderManager/CursorLoader 似乎要连接到我不需要的内容提供程序,因为此 SQlite 数据仅由我的应用程序使用,不需要共享给其他应用程序。
您能否就该主题提供一些说明?
对于带有 SQlite 数据的 AutoCompleteTextViews,建议使用哪个适配器?
非常感谢
android - 在Fragment中一个接一个的initLoader
我有一个片段需要加载 7 个加载器
在 onActivityCreate();
我为所有这些调用了 initLoader。
我怎样才能有效地加载它们以解决内存问题,
我在想什么
是在方法中加载第一个加载器,onActivityCreated
并在其中onLoadFinished
的回调中加载第二个加载器,在第二个加载器中加载第三个,依此类推。好吗 ?或者我错过了关于片段生命周期的一些东西。onLoadFinished
initLoader
注意:我不能有一个回调,因为每个加载器返回不同的数据类型。
android - 基于 SQLite 支持的 ContentProvider 更新 ListView
我是一名新的 Android 开发人员,似乎有点过头了。当我向列表中添加更多内容时,我正在尝试更新 listView。
ListView 基于 SQLite 数据库。我能够通过为 SQLite 数据库创建一个 ContentProvider 来使 ListView 基于 SQLite 数据库(这里建议)。现在我的问题是我想更新 SQLite 数据库并将其反映在 ListView 上。我正在使用加载器,根据这一点,如果我正确实施了加载器,它将监控数据。
我尝试直接更新 SQLite 数据库,但这并没有导致 ListView 在不关闭和重新打开的情况下更新。我的直觉是我应该在我的 contentProvider 中实现 insert 方法。我做了一个非常简单的实现:
不幸的是,结果是我的应用程序因“java.lang.NullPointerException”而崩溃。这尤其令人困惑,因为使用完全相同的 contentValues 从我的 MainActivity 调用 .insertCollection 没有问题。
我真正感兴趣的问题是当我将数据插入 SQLite 数据库时如何让我的 listView 更新。如果插入 ContentProvider 无关紧要,请忽略它。我不确定我哪里出错了,所以我不确定其他代码可能有用,但如果有帮助,我很乐意编辑更多代码。
android - 尝试将 Loader 与 AsyncTask 一起使用。(安卓)
我正在尝试将 Loader 与 AsyncTask 一起使用,但是在 DoinBackground 方法中执行 Loader 的调用给了我一个错误:LoaderManager 类型中的方法 initLoader(int, Bundle, LoaderManager.LoaderCallbacks) 不适用于参数( int, null, LoaderClass.MagicCall)
这是我的代码:
android - 哪个更好:Loader 或 Headless Fragments
从那以后,一直存在一些问题AsyncTask
。所以,现在,我正在考虑改用 Loader 或 Headless Fragments。
我的应用程序是一个社交媒体应用程序,人们在其中评论、发布、喜欢和做更多的事情。每个活动都从服务器获取图像,我必须缓存它们。要处理运行时配置更改,哪个更适合此应用程序。装载机或无头碎片。
我要处理每个陷阱,例如从服务器加载数据并且活动进入onStop()
或onPause()
状态时。帮助!
android - 如何使用 sqlite 视图进行 Loader 更新?
我遇到了LoaderManager的问题。我在 sqlite 数据库中有一些表,也有表示视图,它从表中获取数据。
我也实现了 LoaderManager,就像在那个优秀的指南中一样,它非常适合桌子。
但我想更新一个表,而不是从它获取更新结果,而是从与更新表相关的 sqlite 视图获取更新结果。在这种情况下,LoaderManager 似乎不起作用(未触发 onLoadFinished 回调)
我更新的表架构:
我的sqlite视图:
android - 4.x 中的 Android 加载程序
我的问题很简单。是否有必要在使用 Android 4.0 或更高版本的应用中使用 Loaders?
我读过它只有在您使用 Android 3.0 或更低版本时才有用。
谢谢大家!