Android 双向滑动表格控件实现--FormLayoutManager

前言

为什么会有这篇文章诞生呢?本人工作以为一直没做个表格控件的需求,直到最近的新公司,要做一个表格的需求。一开始遇到需求,自己脑海就先构思了一下思路。当然也会想大家一样百度谷歌看看大家普遍是怎么做的。一百度,我就惊讶了。

怎么大家都是recyclerview或listview外面一层套一个HorizontalScrollView来实现表格。我就想为啥不一个recyclerview用一个FormLayoutManager来实现。也许大家现在再找这个FormLayoutManager,发现谷歌好像没自带这个LayoutManager喔,没错这是我自定义的一个LayoutManager。其实会自定义LayoutManager的程序员也不少,为什么大家就没想到用来实现表格的?

不是因为我冰雪聪明,是因为大家懒。大家天天看博客,看github,用别人的库,就想着怎么用就行了。学会了自定义某个大类,但平时又不用于生活中,这样浑浑噩噩,你良心疼不疼。我也喜欢用第三方的开源库,一来免费,二来好用。那我良心就不疼,等我写完这系列文章就不疼了,因为我也开始写一些第三方库,虽然是一些小库,但起码自我感觉好像踏进大神们的领域,就好像港剧里面一个打工仔终于有幸踏入太平山俱乐部一样。

正经事说完了,接下来就开始介绍不正经的那些事。

区别

用一个Recyclerview加这个FormLayoutManager与平时HorizontalScrollView嵌套Recyclerview实现表格用什么区别呢?我肯定会夸自己的好啦,所以先说一下用FormLayoutManager的优点。

1、好明显,用FormLayoutManager就少了不必要的嵌套了,这一点应该不用多说;

2、看下图就可以发现FormLayoutManager实现的表格,手指可以向任意方向滑动。而嵌套的做法,当你的手指进行水平的滑动,只要你手指不松开屏幕,你就行垂直方向的滑动,表格是不会垂直滑的。只有当你松开手指才能改变你滑动的方向。这要好理解,因为HorizontalScrollView嵌套Recyclerview,水平的滚动事件是交个了HorizontalScrollView做处理,而垂直滚动就只有Recyclerview会处理,所以要松开手指才能改变方向。(如果用FormLayoutManager也想做出以前的嵌套那种滑动交互的话,我FormLayoutManager库也提供了方法)

                                                                 

                                  FormLayoutManager                                                                            嵌套

3、第三点也是差别最厉害的一点,嵌套的做法,大家都知道那样做Recyclerview是上下滚的,它会复用的View其实就是你每一行的View。而你这个表格没出现在屏幕上的右边部分,HorizontalScrollView不会帮你复用的,你左右滚的时候,在右边部分的那些view是一早就被创建的view,是一直都在的。也就是说,在右边部分那些明明不出现在屏幕上的view,却被我们创建了。当你那个表格有很多列(即右边很长的时候),你就发现性能会有问题。而等登登等,FormLayoutManager加一个Recyclerview,它复用的是表格每一个格子的View,不管左右滚上下滚,全部都会复用。

4、这一点其实可以说是缺点,就因为FormLayoutManager这种做法复用的是每一个格,所以暂时用FormLayoutManager来实现表格的一个前提就是,你的表格每个格宽高都要一样。如果你表格每个格不是同宽高,某几列要比较宽一点的那种需求,你暂时还是用会以前的嵌套做法。为什么说是暂时呢,因为我想过也有办法完善FormLayoutManager,让它的adapter像平时那样根据不同的类型获取不同的View。但我暂时还不想写,因为我懒,最近鬼泣5的血宫还没打包。

4、LayoutManager实现表格,现在也可以不同列或不同行根据类型使用不同的布局。但有个限制,不同列使用不同的布局时,每个布局的高度必须一样,这个应该好理解,不同列你表格的宽可以不一样,但作为同一行每个item的高肯定一样,要不你的表格都变瀑布型了。同理不同行多类型的每个item的布局宽必须一样。顺便一提,我已经打爆鬼泣5尼禄的血宫了,接下来就是但丁了。

总之等我这几篇关于FormLayoutManager的文章写完,再考虑去完善。也许在座的你们,看完我这个库后,你们也想到办法完善,到时候就带一带我,我不要又徒添几根白发。

学习

从上面看来,大家也知道我的做法主要就是自定义LayoutManager。那首先还不太懂自定义LayoutManager的伙伴们先把下面这个大神的几篇文章先读完,最好跟着手动写写。我可不会手把手教你怎么自定义,先看我这几篇,在看我后面FormLayoutManager的实现也好理解一点。

自定义LayoutManager看完图中四篇

总结

其实如果你想用这个FormLayoutManager,不太想了解实现思路的话,下面就是GitHub地址,里面也有demo。

FormLaoutManager的GitHub地址

由于本人比较懒,也不清楚实现思路原理的文章什么时候写完,大家符合需求的话可以想用着先。我想把标题写好,后面再慢慢补文章

实现思路原理文章

Adapter基类用法

FormLayoutManager -- 解说(1)

FormLayoutManager -- 解说(2)

待续未定……

发布了17 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/DNWalter/article/details/103744584
今日推荐