设置啥 CursorAdapter(Context context, Cursor c, int flags) 以使其与 CursorLoader 一起工作?

Posted

技术标签:

【中文标题】设置啥 CursorAdapter(Context context, Cursor c, int flags) 以使其与 CursorLoader 一起工作?【英文标题】:What to set CursorAdapter(Context context, Cursor c, int flags) to in order to make it work with CursorLoader?设置什么 CursorAdapter(Context context, Cursor c, int flags) 以使其与 CursorLoader 一起工作? 【发布时间】:2012-06-21 01:04:06 【问题描述】:

谷歌文档指出不要使用CursorAdapters 第一个构造函数,

CursorAdapter(Context context, Cursor c)

只有另外两个选项,

CursorAdapter(Context context, Cursor c, boolean autoRequery)

上面写着

允许控制自动重新查询的构造函数。建议您不要使用它,而是使用 CursorAdapter(Context, Cursor, int)。使用此构造函数时,将始终设置 FLAG_REGISTER_CONTENT_OBSERVER。`

CursorAdapter(Context context, Cursor c, int flags)`

表示它是推荐的构造函数。

问题是这里的最后一个构造函数只有两个标志可以使用,FLAG_AUTO_REQUERY(int 1) 和 FLAG_REGISTER_CONTENT_OBSERVER(int 2)。 使用 FLAG_AUTO_REQUERY 没有意义,因为我现在使用 CursorLoader 在后台管理它并更新它。使用FLAG_REGISTER_CONTENT_OBSERVER,表示使用CursorLoader时不需要。

现在我问,我应该传递什么整数 CursorAdapter(Context context, Cursor c, int flags) 才能使它与我的 CursorAdapter 正常工作?让我担心的是如何正确管理旧光标。我不确定这样做的正确方法。

如果我使用FLAG_REGISTER_CONTENT_OBSERVER,那么我必须对onContentChanged() 做一些事情,但是当在我的LoaderManager 中使用swapCursor() 时,由于光标没有关闭,我可以只做adapter.swapCursor(cursor).close()。但这会与CursorAdapter 中的onContentChanged() 冲突吗?目标是不造成任何内存泄漏并提高效率。

【问题讨论】:

【参考方案1】:

几周前我在博客上写过这个主题...也许通读它会有所帮助。您也可以考虑阅读开发者网站上的sample code。

Reaping the Benefits of the LoaderManager Class


我应该使用哪个构造函数?

使用CursorAdapter(Context context, Cursor c, int flags)(文档建议使用此构造函数而不是前者)。

我传递什么整数CursorAdapter(Context context, Cursor c, int flags)

只需将整数 0 传递给它。你不想传递它FLAG_REGISTER_CONTENT_OBSERVER,因为你正在使用CursorLoader 和你的CursorAdapter(因为CursorLoader 注册了ContentObserver for you), and you definitely don't want to pass itFLAG_AUTO_REQUERY`,因为该标志已被弃用。

让我担心的是如何正确管理旧光标。我不确定这样做的正确方法。

LoaderManager 的全部意义在于它在幕后为您完成了所有烦人的光标管理工作。自动加载数据而无需担心管理查询游标的便利正是旧的startManagingCursorstopManagingCursor 方法被弃用的原因。

...我可以这样做adapter.swapCursor(cursor).close()

不要那样做。 LoaderManager 将自行关闭光标。事实上,如果我没记错的话,如果你试图在光标上调用close(),你会得到一个错误。听起来您也不应该覆盖onContentChanged()

【讨论】:

Lmao,你刚刚得到了所有的答案,伙计!谢谢。我会阅读你的博客。谢谢! LoaderManager 是我的专长...它也是我在 android 框架中最喜欢的类 :)。我期待着回答你的下一个问题:P 应该在 API 中定义一个 CursorAdapter.FLAG_NONE = 0 ... 谢谢@AlexLockwood

以上是关于设置啥 CursorAdapter(Context context, Cursor c, int flags) 以使其与 CursorLoader 一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用CursorAdapter将Filter设置为ListView?

带有自定义 CursorAdapter 的 Android ListFragment 不显示数据

Android CursorAdapter的使用

VFP CursorAdapter 起步二(作者:Dung Hennig 译者:fbilo)

Espresso CursorAdapter:点击第一项

带 LoaderManager 的 CursorLoader 如何知道将光标发送到 CursorAdapter?