【背景】
很多時候在做WP開發的過程中會遇到資料需要分頁擷取,根據微軟官方的推薦方式,建議實現為Market中類似的體驗,即滑動到列表的底部的時候載入更多的資料。
這一需求在早起WP7.1時代實現起來是很費勁的,需要藉助WP Toolkit 中的LongListSelector,而自從LLS被微軟扶正之後這一需求的實現有了更官方的方法。
【實現思路】
LLS傳承了Listbox UI虛擬化的特性,所謂UI虛擬化即列表資料來源中的資料不會一次性根據ItemTemplete將所有資料UI化,而是隨著列表的滑動,隨時將資料UI化,或者將UI化的資料釋放掉。舉例說明下更直觀:
比如,LLS資料來源中有1W條User類型的資料,記錄使用者資訊。LLS負責展示這1W條資料。假設一屏能顯示10條。那麼UI虛擬化的工作就是:
1、將30條(舉例的資料)User根據ItemTemplete繪製出對應的30個UI控制項
2、向下滑動看到第20條資料的時候,從資料來源中拿出20條繪製UI控制項,並將前20條的繪製出來的控制項釋放掉。
3、向下滑動看到第40條資料的時候,再從資料來源中拿出20條繪製UI控制項,並將前20條繪製出來的控制項釋放掉。
4、往上滑動重新回到第20條資料的時候,反向再進行一次繪製和釋放
以上UI虛擬化的概念瞭解後我們標題中的需求就很好實現了。
LLS定義了OnItemRealized事件,其作用簡單說:當LLS根據ItemTemplete繪製UI控制項時會觸發此事件,通知使用者當前繪製的是哪一個資料。
【具體程式碼分析】
根據這個定義我們實現的代碼如下:
解釋:
1、Offset 為距離資料來源中最後一項的位移量
2、IsLoading為相依性屬性,標識當前正在載入資料
3、當OnItemRealized事件觸發時,判斷當前Realized的Item是否為資料來源的倒數第二項,如果是,則認為需要載入新的資料,觸發DataRequest事件
如此一個簡單通用的"無盡列表"便實現了。
查看本欄目更多精彩內容:http://www.bianceng.cn/OS/extra/
參考:
http://msdn.microsoft.com/library/windowsphone/develop/microsoft.phone.controls.longlistselector.itemrealized(v=vs.105).aspx
http://code.msdn.microsoft.com/wpapps/TwitterSearch-Windows-b7fc4e5e
完整代碼見:
https://gist.github.com/tianhonghui/6999984