这不是代码问题,我将指南解释为没问题。
我一直在研究一种在 Android 中构建类似日历的无限 ScrollView 的方法,但我陷入了僵局。
现在我的困境是,大多数可用的相似 View 都以重复的方式将它们的 subview 相对放置。我的意思是:
item 4 在 item 3 之后,item 3 在 item 2 之后,并且所有项目之间有恒定的填充/边距。
我需要的是一种生成无限长的可 ScrollView 的方法,该 View 可能包含也可能不包含项目。这些项目应放置在 View 中的可变位置。我可以描述外观相似的 View 的最佳方式是可无限滚动的类似日历的一天 View 。
到目前为止,我最好的两个选择是使用新的 RecyclerView
和自定义的 LayoutManager
(这看起来非常复杂,但谷歌仍然没有完美记录)。我喜欢这种方法,因为除其他外,它针对在有限 View 中显示大型集合进行了优化。
我的另一个解决方案是构建一个完全自定义的 View
。但是,使用该解决方案我会松开适配器,除非我构建容器 View (这可能比构建布局管理器更复杂)。
您将如何解决这样的问题?感谢提示,我不需要代码示例,只需要知道哪条路径是解决此问题的最佳途径。
谢谢。
如果我误解了指南,请道歉
编辑:我是如何解决这个问题的 我的第一个解决方案是使用带有特殊装饰器的 RecyclerView 似乎很有前途,但它仍然是一个“hack”,所以我们决定不采用该解决方案,因为我们担心它会在生产线上造成复杂情况。
为了解决这个问题,我使用了 SurfaceView 而不是适配器,这意味着必须为我的 SurfaceView 重写所有适配器功能,但这似乎是解决这个非常自定义的绘图和布局管理问题的最佳方法我的用例。
构建一个可以处理此类布局问题的自定义 Viewgroup 仍然会很好。
最佳答案
ListView
和 ListAdapter
基于固定列表,因此当前的无限滚动器只是不断向列表末尾添加越来越多的数据。
但您想要的是类似于 Google 日历应用的滚动条,它具有双向无限滚动条。在这种情况下使用 ListView
和 ListAdapter
的问题在于,如果将数据添加到列表的前面,任何一项的索引都会发生变化,从而导致列表跳转。
如果您真的开始从 MVC 的角度考虑这个问题,您就会意识到 ListAdapter
没有提供满足这种需求的模型。
您真正想要的不是绝对索引(即 1、2、3、4 等),而是相对索引,因此与其说“给我索引 42 处的项目”,不如说“这是一个项目” ,把它前面的五项给我”。或者你有一个绝对的日历日期;然而 — 与您设备的内存不同 — 它实际上没有开始或结束,因此您真正需要的是进入该数据部分的“窗口”。
一个更好的数据模型是一种双端队列,它部分是 LRU 缓存。您对结构中的项数设置了限制。然后,当加载前面的项目(用户向上滚动)时,后端的项目被推开,当添加后续项目(用户向下滚动)时,前面的项目被推开。
此外,您将有一个阈值,如果您进入结构的一个边缘的几个项目内,“loadNext”或“loadPrevious”事件将触发并调用您设置的回调以将更多数据推送到结构的边缘。
因此,一旦您发现您的模型完全不同,您就会意识到即使是 RecyclerView
也不会在这里帮助您,因为它与绝对索引模型相关联。您需要某种自定义 ViewGroup 子类,它可以像 ListView
一样回收项目 View ,但可以适应双端队列。当你在代码库中搜索类似这样的东西时,那里什么也没有。
听起来很有趣。当我开始一个项目时,我会发布一个链接。 (遗憾的是,目前无法及时为您提供帮助,抱歉。)
一些可能会更快帮助您的东西:查看 Google 的日历实现并了解他们是如何做到的:Google Calendar Git repo
关于android - 在 Android 中构建一个无限滚动的类似日历的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29273829/