【问题标题】:Is it safe to pass a cursor to another activity?将光标传递给另一个活动是否安全?
【发布时间】:2012-12-08 11:28:44
【问题描述】:

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

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

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

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

所以我假设当在ListView 中单击一个项目时,我需要启动一个包含ViewPager 的活动。这个ViewPager 由负责在适当位置获取视图的PagerAdapter 提供支持。

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

但是 (1) 我不确定如何将 CursorAdapter 传递给活动,因为我认为它不能被序列化以在包中传递并且 (2) 我犹豫是否传递 CursorAdapter无论如何都到另一个活动,因为没有附加LoaderCallbacks 来管理生命周期。

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

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

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

我确定这是一种常见情况,所以我想知道在多个活动中管理游标的最佳做法是什么,或者其他方法是否更好。

【问题讨论】:

  • 您不能创建一个数据库来支持您的列表项并将索引传递给信息活动吗?或者在列表视图之上创建一个隐藏视图,以显示所选项目的信息,并在用户想要返回列表视图时将其隐藏。
  • 感谢您的评论。我对您在现有活动的现有列表视图之上创建详细视图的建议很感兴趣。而不是使用单独的活动。我假设这里会从onListItemClicked 处理程序的布局中删除列表视图,然后将ViewPager 添加到布局中。棘手的问题将是处理返回按钮以返回原始列表视图,以及在横向模式下做什么,当详细视图将与列表视图一起存在时(使用片段)。但我会多考虑一下。
  • 我也在使用数据库;如果使用单独的详细信息活动,一个选项(我已经建议)是再次执行相同的搜索,然后根据列表项的位置调用 cursor.moveToPosition()。我不喜欢这个选项,因为这意味着执行两次相同的搜索会带来相关的性能问题。

标签: android android-viewpager android-cursor


【解决方案1】:

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

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

【讨论】:

  • 感谢您的评论。我有点认为在活动之间传递光标是个坏主意,这就是为什么我不愿意这样做并寻求建议。我认为您在这里建议的是在新活动中生成一个新光标,然后根据单击的列表项的位置移动该光标?但我不确定如何在不执行其他搜索的情况下在新活动中创建新光标。
  • 是的,您必须执行查询。但是查询不会是您将采取的最耗费资源的步骤。您进行查询只是为了加载您的pageAdapter,然后根据单击项目的位置移动 pageAdapter
  • 所以我选择在新活动中生成一个新查询。两次执行相同的搜索让我很恼火,但我认为没有其他安全方法。
  • 如果有那么麻烦,您可以尝试将两个组件放在同一个活动中,但也可以放在一个视图切换器中,这样看起来就不同了。
  • 谢谢。我不知道ViewSwitcher 类。在之前的评论中提到了在两个视图之间切换,但我现在可以尝试一下,因为我知道这个类。我当前的实现有一个显示列表视图的活动,然后启动另一个活动以显示分页视图。但是ViewSwitcher 可能是更好的解决方案:在列表视图中单击项目时从列表视图切换到分页器视图,在按下后退按钮时从分页器视图切换到列表视图(假设可以处理)。
猜你喜欢
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多