Android 一個RecyclerView的雙向滑動表格控件實現--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尼祿的血宮了,接下來就是但丁了。

 

 

學習

從上面看來,大家也知道我的做法主要就是自定義LayoutManager。那首先還不太懂自定義LayoutManager的夥伴們先把下面這個大神的幾篇文章先讀完,最好跟着手動寫寫。我可不會手把手教你怎麼自定義,先看我這幾篇,在看我後面FormLayoutManager的實現也好理解一點。

自定義LayoutManager看完圖中四篇

總結

其實如果你想用這個FormLayoutManager,不太想了解實現思路的話,下面就是GitHub地址,裏面也有demo。

FormLaoutManager的GitHub地址

由於本人比較懶,也不清楚實現思路原理的文章什麼時候寫完,大家符合需求的話可以想用着先。我想把標題寫好,後面再慢慢補文章

 

實現思路原理文章

Adapter基類用法

FormLayoutManager -- 解說(1)

FormLayoutManager -- 解說(2)

FormLayoutManager -- 單方向滑動的recyclerview

FormLayoutManager -- 默認顯示位置

FormScrollHelper--標題和表格聯合滾動

FormLayoutManager--多類型表格

FormLayoutManager -- 每格設置不同背景顏色或字體顏色

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章