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

And*_*eas 6 android custom-view android-custom-view infinite-scroll android-recyclerview

这不是代码问题,我将指南解释为正常.

我一直在研究一种在Android中构建无限滚动日历视图的方法,但我已陷入僵局.

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

项目4在项目3之后,在项目2之后,并且在所有项目之间存在恒定的填充/边距.

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

到目前为止,我最好的两个赌注是使用新RecyclerView的定制LayoutManager(这看起来非常复杂,但仍然没有完全由谷歌记录).我喜欢这种方法,因为除了其他方面,它还针对在有限视图中显示大型集合进行了优化.

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

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

谢谢.

如果我误解了指南,请道歉

编辑:我如何解决这个问题 我的第一个使用RecyclerView与一个特殊的装饰器的解决方案似乎很有希望,但它仍然是一个"黑客",所以我们决定不去寻找那个解决方案,因为我们害怕它会产生的复杂性.

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

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

kri*_*son 8

ListView并且ListAdapter基于固定列表,因此当前的无限滚动器只是在列表的末尾添加越来越多的数据.

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

如果你真的从MVC的角度开始考虑这个问题,你会发现它ListAdapter并没有提供满足这种需求的模型.

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

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

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

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

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

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


use*_*866 0

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

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

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

Android 的在线教程有很多,也许你可以看一下这个