设置啥 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 it
FLAG_AUTO_REQUERY`,因为该标志已被弃用。
让我担心的是如何正确管理旧光标。我不确定这样做的正确方法。
LoaderManager
的全部意义在于它在幕后为您完成了所有烦人的光标管理工作。自动加载数据而无需担心管理查询游标的便利正是旧的startManagingCursor
和stopManagingCursor
方法被弃用的原因。
...我可以这样做
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 不显示数据