我正在尝试使用光标进行水平滑动,但我只是不喜欢某些东西,希望这里有人可以帮助我理解。
我有一个显示项目列表的活动。它使用由自定义ListView
支持的CursorAdapter
,该适配器由LoaderCallback
管理。这都是标准的东西。
当用户点击列表中的项目时,我想显示有关该项目的详细信息。目前,我开始一项新活动,传递所选项目的ID。此活动将从数据库加载有关该项的信息。再次,标准的东西。
现在,在项目列表之间来回切换并单击项目以显示有关该项目的更多详细信息并非最佳用户体验,并且最好允许用户单击项目以显示其信息,然后允许滑动以显示列表中下一个或上一个项目的详细信息。
因此,我假设在ListView
中点击某个项目时,我需要启动包含ViewPager
的活动。此ViewPager
由PagerAdapter支持,该PagerAdapter负责在适当的位置获取视图。
所以我想将list活动中使用的CursorAdapter
传递给detail活动,然后实现遍历游标的PagerAdapter
以显示视图中当前项的详细信息寻呼机。这看起来很简单:getItem(pos)
会调用cursor.moveToPosition(pos)
然后从光标创建一个片段等。
但是(1)我不确定如何将CursorAdapter
传递给一个活动,因为我认为它不能被序列化以便在一个包内通过而且(2)我犹豫是否通过无论如何,CursorAdapter到另一个活动,因为没有附加LoaderCallbacks
来管理生命周期。
一种可能的解决方案是启动新活动并让该活动执行新搜索,以获得与列表活动中找到的游标等效的游标。例如,列表活动可能已显示与“title = foo”匹配的项目,因此当单击项目10时,我们创建一个新的详细活动,显示有关项目10的信息,但也执行“title = foo”搜索以获取可以在水平滑动中使用的光标。但这意味着我正在执行相同的搜索两次:一次在列表视图中,一次在分页视图中。如果搜索需要一些时间,这可能是一个问题。
我还可以将光标存储在某个全局静态区域(例如Application
),但这似乎也充满了危险。
还有Parcelable
但我认为这意味着我在一侧序列化光标并在另一侧反序列化它。对于大型列表,再次执行搜索以获取新游标可能更有效。
我确信这是一个常见的场景,所以我想知道在多个活动中管理游标的最佳做法是什么,或者其他方法可能更好。
答案 0 :(得分:2)
没有。请不要将任何光标或游标适配器或类似的东西传递给其他活动。在该过程的某个级别,您必须必须传递活动的context
才能创建对象。如果该对象以某种方式使用另一个上下文进入另一个活动,那么事情可能会变得疯狂。
此外,我不明白为什么你首先需要适配器本身。是不是有一种方法可以只使用光标(重新实例化)新活动的相同光标,传递点击的位置并制作PagerAdapter
,然后预先选择所需的细节位置查看?就像你说的那样,但你不需要新的搜索,在意图中传递position
。