1. 程式人生 > >Sticky Header的另一種實現方法

Sticky Header的另一種實現方法

使用Sticky Header的list單個item一般情況下使用的資料結構是
{data:"what's inside", category:"section name"}
這樣儲存其實是浪費了很多的空間,因為category的名字被儲存的多次。在移動環境中,傳輸這種多餘資訊是不文明的。
由此可以演化出兩種資料結構,一個是樹形的{category0:[data...data],...};另一種是線性的[category0,data0-from-c0...,category1,data0-from-c1,...]。如果把廣為流傳的Section Indexer用在這兩種資料上,需要進行資料轉換,資料很多可能有效能問題。
使用第二種格式的資料,可以用簡單的思路實現一個Sticky Header:
- 為資料建立一個基類,category和data均繼承自此,放入一個list中;
- 為每一個型別建立獨立的layout和ViewHolder,ViewHolder以Fragment的形式,提供統一的對外介面,實現所有的對應項邏輯(類似於RecyclerView);
- 設定ListView的ScrollListener,在OnScroll中監聽兩個事件:
- 當category是第二個可見元素時,進行推擠Indexer的操作;
- 當category是第一個可見元素時,將Indexer復位,覆蓋category對應的Item。
這種方案似乎比現有的方法顯示效率高一些,因為不需要改變第一個data item中佔位符的可見性,減少了繪製次數。