android - 将光标传递到另一个 Activity 是否安全?

标签 android android-viewpager android-cursor

我正在尝试使用光标进行水平滑动,但我只是没有摸索某些东西,希望这里有人可以帮助我理解。

我有一个显示项目列表的 Activity 。它使用由自定义 CursorAdapter 支持的 ListView,并且该适配器由 LoaderCallback 管理。这都是标准的东西。

当用户单击列表中的某个项目时,我想显示有关该项目的详细信息。目前,我开始一个新 Activity ,传递所选项目的 ID。此 Activity 将从数据库加载有关该项目的信息。再说一遍,标准的东西。

现在,在项目列表之间来回移动并单击某个项目以显示有关该项目的更多详细信息并不是最佳的用户体验,最好允许用户单击某个项目以显示其信息,然后允许滑动以显示列表中下一个或上一个项目的详细信息。

因此,我假设当在 ListView 中单击某个项目时,我需要启动一个包含 ViewPager 的 Activity 。这个 ViewPager 由 PagerAdapter 支持,负责在适当的位置获取 View 。

所以我想将列表 Activity 中使用的 CursorAdapter 传递给详细信息 Activity ,然后实现一个 PagerAdapter 来遍历光标以显示详细信息 View 寻呼机中的当前项目。这看起来很简单:getItem(pos) 会调用 cursor.moveToPosition(pos) 然后从光标创建一个 Fragment,等等

但是(1)我不确定如何将 CursorAdapter 传递给 Activity ,因为我认为它无法序列化以在包内传递,并且(2)我无论如何,我都不愿意将 CursorAdapter 传递给另一个 Activity ,因为没有附加 LoaderCallbacks 来管理生命周期。

一种可能的解决方案是启动新 Activity 并让该 Activity 执行新搜索以获得与列表 Activity 中找到的光标等效的光标。例如,列表 Activity 可能显示了与“title=foo”匹配的项目,因此当单击项目 10 时,我们创建一个新的详细信息 Activity ,该 Activity 显示有关项目 10 的信息,同时还执行“title=foo”搜索来获取可水平滑动的光标。但这意味着我要执行两次相同的搜索:一次在 ListView 中,一次在分页 View 中。如果搜索需要一些时间,这可能会成为一个问题。

我还可以将光标存储在某些全局静态区域(例如Application)中,但这似乎也充满危险。

还有 Parcelable 但我认为这意味着我在一侧序列化光标并在另一侧反序列化它。对于大型列表,再次执行搜索以获得新光标可能会更有效。

我确定这是一种常见情况,因此我想知道跨多个 Activity 管理游标的最佳实践是什么,或者其他方法是否可能更好。

最佳答案

没有。请不要将任何光标或光标适配器或类似的东西传递给其他 Activity 。在流程的某个级别,您必须传递 Activity 的上下文才能创建对象。如果该对象以某种方式使用另一个对象的上下文进入另一个 Activity ,那么事情可能会变得疯狂。

此外,我不明白为什么你首先需要适配器本身。是否有一种方法可以让您仅使用光标(重新实例化)新 Activity 的相同光标,传递单击的位置并创建您的 PagerAdapter ,然后预先选择详细位置您想查看什么?就像你所说的,但你不需要新的搜索,在 Intent 中传递 position

关于android - 将光标传递到另一个 Activity 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13774020/

相关文章:

android - 防止在 ImageView 单击时显示状态栏

android - ViewPager 上同时显示多个页面

Android:删除数据库行后如何重新查询游标以刷新ListView?

android - 如何使用 SQLite Database.Cursor Factory

java - 无法在 android 4.2 上运行新的异步任务实例

android - 如何获取正在phonegap中下载的文件/文件夹的大小

Android:为 jar 提供自己的 java.* 类实现

android - 如何从某个位置获取PagerAdapter的当前View?

android - 导航回 fragment 时 fragment 中的 Viewpager 未更新

android - 从联系人列表中获取姓名和电子邮件非常慢