原文:recyclerview: grid with header
gridview和listview有許多的相似之處,不過也有一個顯著的不同:沒有header和footer。現在它們兩者都可以用recyclerview實作,我想看看如何在grid上添加header。
我用gridlayoutmanager建立了一個spancount為2的recylcerview。
注:spancount即列數。這裡gridlayoutmanager的第二個參數就是spancount。
numberedadapter 以字元串的形式顯示了每個item的position,在點選的時候顯示一個toast。
gridlayoutactivity.java
在上面的基本設定中,我們的spancount為2,每個item的span size為1,是以一個header需要的span size則為2。在我嘗試着添加header之前,我想先看看如何設定 span size。其實很簡單。
注:span size表示一個item的跨度,跨度了多少個span。
setspansizelookup可以讓你根據position來設定 span size,上面代碼中的公式所得到的 span size依次是3, 2, 1, 3, 2, 1...
gridlayoutvariablespansizeactivity.java
現在讓我們來添加一個header!我們需要一個提供兩種view類型的adapter,一個為header一個為普通的item。可以看看headernumberedadapter,它在構造函數中把一個view作為header,然後把它存在一個成員變量中。
其中textviewholder的代碼為:
在recyclerview建立一個view的時候,如果處于header的位置,我們用view holder來封裝這個header。onbindviewholder中不必對header做任何事情,因為它的邏輯是在activity中處理的。
回到activity。我們需要用一個header來初始化headernumberedadapter,同時重寫setspansizelookup,讓header橫跨所有列。
我們inflate header,定義它的點選事件,使用它去構造adapter。然後再setspansizelookup中,我們在header所處的位置傳回和span count (列數)相等的 span size。
為了用recyclerview建立一個帶header的grid:
定義一個具有兩種view類型的adapter,一個為header一個為普通item。
nflate一個header,把它傳遞給adapter。
重寫gridlayoutmanager中的setspansizelookup,在header所處的位置傳回和span count (列數)相等的 span size。
源碼: https://github.com/chiuki/android-recyclerview
ps:在我的g+上有人評論說如果你不需要recyclerview的功能,比如animation,reordering,staggering等,你也可以從aosp中拷貝headergridview.java。