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版本均爲Duilib_Ultimate
源碼地址爲:
1、https://github.com/qdtroy/DuiLib_Ultimate
2、https://gitee.com/qdtroy/Duilib_Ultimate

完整代碼請聯繫Troy(QQ:656067418)
duilib開源項目交流圈(QQ羣:261851826、261675375)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章