我想使用 ViewPager 从单个 Cursor(最初来自 ContentProvider)显示每页的多个项目。布局将显示为网格,并将包含每个项目的图像和文本。列表中会频繁添加和删除,需要在 UI 中反射(reflect)出来,而无需重建数据结构(这可能会排除下面的某些选项)。
当前进程:
- 在主 Activity 中实例化光标。
- 创建我自己的 Cursor Adapter 类,该类从 PagerAdapter 扩展而来,它接收光标。光标用于通过 getCount() 确定 ViewPager 将具有的页面数(然后根据每页显示的项目数进行调整)。
- 在 Cursor Adapter getItem 方法中,它创建最终将包含列表子集的 fragment 。
现阶段,我不确定哪种方法最好。我是:
A.将 Cursor 和索引传递给 Fragment 以显示下一页结果(例如,使用 setCursorIndex( Cursor, int ) 方法。(即使在同一个 Activity 中,跨 Fragment 共享 Cursors 是否会导致问题?)嗯>
B.传入将获得结果的 ContentUris 字符串列表。 (这会阻止在无需重建的情况下更新列表吗?)
C.构建包含项目的参数包(包含图像和文本的字节数组的列表)。 (由于使用图像,这似乎效率低下。)
D.在从适配器接收到起始索引的每个 fragment 中重新创建一个新的游标。 (效率低下?)
非常感谢您的帮助。
最佳答案
恕我直言,答案是 B 和 C 的某种组合。
它是 C,只要您创建一个参数 Bundle
并将其提供给 Fragment
,也许使用工厂方法模式(例如,newInstance()
)。这样,如果 fragment 将被销毁并重新创建,那么在配置更改期间您将拥有 fragment 中的所有数据。
但是,“包含图像和文本字节数组的列表”似乎不合适。如果您已有图像的 Uri
值(或 Uri
值的 String
表示形式),请将这些放入 bundle
,并使用集中式图像缓存解决方案(例如 this one 或 this one )以确保您仅在需要时加载这些图像。其他小东西(“和文本”)可以直接放入 Bundle
中。
选项 A 可能可行,但您必须小心考虑:
- 配置更改(当用户旋转屏幕并且您的 Activity 被销毁/重新创建时会发生什么?)
- 光标中的隐式当前行指针(每个 fragment 在尝试读取任何数据之前都需要
moveToPosition()
)
关于android - ViewPager 中光标驱动的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14083116/