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; }) } }