91 lines
3.1 KiB
TypeScript
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;
|
|
|
|
})
|
|
}
|
|
} |