在Android中构建无限可滚动日历的视图

时间:2015-03-26 08:23:07

标签: android android-custom-view infinite-scroll android-recyclerview custom-view

这不是代码问题,我将指南解释为没问题。

我一直在研究如何在Android中构建无限滚动日历的视图,但我已陷入僵局。

现在我的困境是,大多数类似的观点都让他们的孩子以反复的方式相互放置。我的意思是:

第4项出现在第3项之后,它出现在项目2之后,并且所有项目之间都存在持续的填充/边距

我需要的是一种生成无限长可滚动视图的方法,该视图可能包含也可能不包含项目。这些项目应放置在视图中的可变位置。我可以描述类似外观的最佳方式是一天的日历式视图,可以无限滚动

到目前为止,我最好的两个赌注是使用新的RecyclerView并使用自定义LayoutManager(这看起来非常复杂,但Google仍未完全记录)。我喜欢这种方法,因为它优化了在有限的视图中显示大型集合。

我的另一个解决方案是构建一个完全自定义的View。但是,使用该解决方案,我松开了适配器,除非我构建容器视图(这可能比构建布局管理器更复杂)。

你将如何解决这样的问题?感谢提示,我不需要代码示例,只是想法哪条路径最能解决这个问题。

感谢。

如果我误解了指南

,请道歉

编辑:我如何解决此问题 我的第一个使用RecyclerView和一个特殊装饰器的解决方案似乎很有希望,但它仍然是一个" hack"所以我们决定不采用这种解决方案,因为我们害怕它会造成的并发症。

为了解决这个问题,我选择了SurfaceView而不是Adapter,这意味着必须重写SurfaceView的所有适配器功能,但它似乎是解决这个非常自定义绘图和布局管理问题的最佳方法。我的用例。

构建可以处理这种布局问题的自定义Viewgroup仍然会很不错。

2 个答案:

答案 0 :(得分:7)

ListViewListAdapter基于固定列表,因此当前的无限卷轴只会在列表末尾添加越来越多的数据。

但你想要的是类似于谷歌的日历应用程序的滚动条,它有一个双向无限卷轴。在这种情况下使用ListViewListAdapter的问题是,如果您将数据添加到列表的前面,则任何一个项的索引都会更改,以便列表跳转。

如果您真的从MVC角度开始考虑这个问题,您会发现ListAdapter没有提供符合此需求的模型。

而不是拥有绝对索引(即1,2,3,4等),你真正想要的是相对索引,所以不要说“给我索引42处的项目”你想说“这是一个项目,给我前面的五个项目“。或者你有类似日历日期的绝对日期;然而 - 与你设备的内存不同 - 它实际上没有开头或结尾,所以你真正想要的是这个数据部分的“窗口”。

更好的数据模型是一种双端队列,部分是LRU缓存。您对结构中的项目数量设置了限制。然后,当先前的项目被加载(用户向上滚动)时,后端的项目被推下,当添加后续项目(用户向下滚动)时,前面的项目被推下。

此外,您将有一个阈值,如果您在结构的一个边缘的几个项目内,“loadNext”或“loadPrevious”事件将触发并调用您设置的回调,以将更多数据推送到结构的边缘。

因此,一旦你发现你的模型完全不同,你就会意识到即使RecyclerView也不会帮助你,因为它与绝对索引模型有关。您需要某种自定义ViewGroup子类来循环项目视图,如ListView,但可以适应双端队列。当你搜索代码回购这样的东西时,那里什么都没有。

听起来很有趣。当我启动项目时,我会发布一个链接。 (可悲的是,现在不能及时帮助你,抱歉。)

可能会更快帮助您的事情:查看Google的日历实施,看看他们是如何做到的:Google Calendar Git repo

答案 1 :(得分:0)

您可能正在搜索的是 FragmentStatePagerAdapter ,您可以在其中实现滑动视图,这意味着当用户(例如)向右滑动时,会显示一个全新的视图。

使用 FragmentStatePagerAdapter ,您可以处理大量的视图而不会溢出内存,因为这个特定的PagerAdapter只会保留视图'状态并明确用于处理大量视图。

保留日历的示例,您可以在几周之间实施滑动导航,并根据需要生成周视图,同时仅保留年份和周数作为标识符。

Android上有很多在线教程,也许您可​​以查看this一个