marineparkclient/assets/common/component/List/VirtualList.ts
2023-08-15 11:09:12 +08:00

91 lines
3.1 KiB
TypeScript

import UI_ListItem from "./UI_ListItem";
export default class VirtualList{
constructor(){}
private scroll:cc.ScrollView;
/**不能使用layout */
private itemContainer:cc.Node;
private mListData:any[];
private viewPortItemCount:number;
private copyeeItem:cc.Node;
private viewPortFirstItem: cc.Node = null;
initVirtualList(viewCount:number,listDatas:any[],itemContainer:cc.Node,scroller:cc.ScrollView,
copyItem:cc.Node) {
this.scroll = scroller;
this.itemContainer = itemContainer;
this.mListData = listDatas;
this.viewPortItemCount = viewCount;
this.copyeeItem = copyItem;
let _data = listDatas.slice(0, viewCount + 1);
this.addVirtualItems(_data,copyItem,itemContainer);
this.viewPortFirstItem = itemContainer.children[0];
scroller.node.on("scrolling", this.onScrolling, this);
}
private addVirtualItems(data: any[],copyItem:cc.Node,itemContainer:cc.Node) {
let _itemHeight:number = copyItem.height;
let _len = data.length;
for (let i = 0; i < _len; i++) {
let _item = cc.instantiate(copyItem);
_item.y = -_itemHeight*i;
let _dataItem = data[i];
let _itemCls = _item.getComponent(UI_ListItem);
_itemCls.showInfo(_dataItem);
_itemCls.itemData = _dataItem;
itemContainer.addChild(_item);
}
}
onScrolling() {
this.calcPosAndSwapItem();
}
calcPosAndSwapItem() {
let _itemData = this.viewPortFirstItem.getComponent(UI_ListItem).itemData;
let _offsetY = this.scroll.getScrollOffset().y;
let _idx: number = _itemData["_list_idx_"];
if (_offsetY > this.viewPortFirstItem.height
) {
let _lastItem = this.itemContainer.children[this.itemContainer.childrenCount - 1];
let _nextDataIdx: number = _lastItem.getComponent(UI_ListItem).itemData["_list_idx_"]+1;
if (_nextDataIdx < this.mListData.length) {
this.swapItem(0,_nextDataIdx, true);
}
} else if (_offsetY < 0
) {
if (_idx > 0) {
this.swapItem(this.viewPortItemCount, _idx-1,false);
}
}
}
swapItem(deleteBeginIdx: number,dataIdx:number, isToEnd: boolean = false) {
let _el = this.itemContainer.children[deleteBeginIdx];
let _top: number = 0;
if (_el) {
let _insertIdx: number = isToEnd ? this.viewPortItemCount : 0;
let _itemData = this.mListData[dataIdx];
_el.getComponent(UI_ListItem).showInfo(_itemData);
this.itemContainer.insertChild(_el, _insertIdx);
this.refreshItemsY();
_top = isToEnd ? 0 : _el.height;
this.scroll.setContentPosition(new cc.Vec2(0, _top));
this.viewPortFirstItem = this.itemContainer.children[0];
}
}
refreshItemsY(){
this.itemContainer.children.forEach((item,idx)=>{
item.y = -idx * this.copyeeItem.height;
})
}
}