【背景】
很多時候在做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://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
關於WP的交流歡迎加入QQ群:182659848