天天看點

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中占位符的可見性,減少了繪制次數。