Duilib使用虛表(VirtualList)機制加載海量數據
Duilib中的數據加載展示
Duilib庫提供了多種適合數據展示的容器控件,如VerticalLayout、HorizontalLayout、TileLayout和List等等。在開發中,我們一般使用List來加載數據列表,List列表有以下幾個優點:列表項創建靈活,支持列頭展示,樣式配置方便。有優點,對應着也有些確定,當加載數據過多時,List列表的滑動繪製效率非常低,甚至難以忍受。爲了解決上面問題,所以很多人在項目中引入了虛表機制,用來加載顯示海量數據。
虛表VirtualList的工作原理
列表在有限的可視區域內,我們只創建必要的ListElement控件,列表的滑動區域則是根據列表項數量和高度提前計算出來,這樣我們在列表滑動過程中,只需要更新我們創建的必要控件的數據內容即可。本來有10W數據,可視區域只能展示100條數據,我們只需要創建100個列表項,這樣在List的繪製和佈局時節省了大量的時間,提高列表的繪製與佈局速度。
虛表VirtualList的部分核心代碼
//虛擬列表數據源接口
class IVListDataSource
{
public:
virtual int GetItemCount() = 0;
virtual void SelectItem(CStdPtrArray& arraySelectIndexList) = 0;
virtual void UnselectItem(CStdPtrArray& arraySelectIndexList) = 0;
virtual void ExclusiveSelectItem(CStdPtrArray& arraySelectIndexList) = 0;
virtual void SelectAllItems() = 0;
virtual void UnselectAllItems() = 0;
virtual bool IsItemSelect(int nIdex) = 0;
virtual LPVOID GetItemDataByIndex(int nIndex) = 0;
virtual CStdPtrArray& GetSelectIndexList() = 0;
virtual void AddData(LPVOID lpData) = 0;
virtual void RemoveDataAt(int nIndex) = 0;
virtual void RemoveAllData() = 0;
virtual bool SortItems(int(__cdecl *_PtFuncCompare)(void*, const void*, const void*), void* pArgs) = 0;
};
//虛擬列表變換器接口
class IVListDataConverter
{
public:
virtual void GetItemSize(int nIndex,LPSIZE lpSize) = 0;
virtual CControlUI* CreateUIFromData(int nIndex,LPVOID lpData) = 0;
virtual void UpdateUIFromData(int nIndex, LPVOID lpData, CControlUI* pControl) = 0;
};
VirtualList列表需要實現如下接口:
void SetDataSource(IVListDataSource* pDataSource);
void SetDataConverter(IVListDataConverter* pDataConverter);
void ReloadData();
bool GetVisibleItemRange(int& nFirstIndex, int& nLastIndex, int& nFirtPos);
void RefreshViewByVScroll();
int CalculateItemTopPos(int nFirstIndex, int nFirstPos, int nItemIndex);
CControlUI* CreateNewItem(int nItemIndex,LPVOID lpData);
虛表VirtualList的最終效果展示
系列教程中學習用到的duilib版本均爲Duilib_Ultimate
源碼地址爲:
1、https://github.com/qdtroy/DuiLib_Ultimate
2、https://gitee.com/qdtroy/Duilib_Ultimate
完整代碼請聯繫Troy(QQ:656067418)
duilib開源項目交流圈(QQ羣:261851826、261675375)