天天看點

android RecyclerView:實作帶header的grid

原文:recyclerview: grid with header 

gridview和listview有許多的相似之處,不過也有一個顯著的不同:沒有header和footer。現在它們兩者都可以用recyclerview實作,我想看看如何在grid上添加header。

我用gridlayoutmanager建立了一個spancount為2的recylcerview。

注:spancount即列數。這裡gridlayoutmanager的第二個參數就是spancount。

numberedadapter 以字元串的形式顯示了每個item的position,在點選的時候顯示一個toast。

android RecyclerView:實作帶header的grid

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...

android RecyclerView:實作帶header的grid

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。

android RecyclerView:實作帶header的grid

為了用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。 

繼續閱讀