XDynamicTableNormal = {} DYNAMIC_DELEGATE_EVENT = { DYNAMIC_GRID_RELOAD_COMPLETED = 1,--加载完成 DYNAMIC_GRID_TOUCHED = 2,--点击 DYNAMIC_GRID_ATINDEX = 3,--更新 DYNAMIC_GRID_RECYCLE = 4,--回收 DYNAMIC_TWEEN_OVER = 5, DYNAMIC_BEGIN_DRAG = 6, DYNAMIC_GRID_INIT = 100 } function XDynamicTableNormal.New(gameObject) if gameObject == nil then XLog.Error("XDynamicTableNormal.New->gameObject == nil, Please check the object is instancing") return nil end local dynamicTable = {} setmetatable(dynamicTable, { __index = XDynamicTableNormal }) local imp = dynamicTable:Init(gameObject) if not imp then XLog.Error("XDynamicTableIrregular.New->can not find the object imp, Please check the Component type is right!") return nil end return dynamicTable end --初始化 function XDynamicTableNormal:Init(gameObject) local imp = gameObject:GetComponent(typeof(CS.XDynamicTableNormal)) if not imp then return false end self.Proxy = nil self.ProxyMap = {} self.ProxyImpMap = {} self.DataSource = {} self.DynamicEventDelegate = nil self.Imp = imp self.Imp:SetViewSize(imp.ScrRect.viewport.rect.size) self.Imp.DynamicTableGridDelegate = function(event, index, grid) self:OnDynamicTableEvent(event, index, grid) end return true end --获取实体组件 function XDynamicTableNormal:GetImpl() return self.Imp end --设置回调主体 function XDynamicTableNormal:SetDelegate(delegate) if not self.Imp then return end self.Imp:SetDelegate(self) self.Delegate = delegate end --事件回调 function XDynamicTableNormal:OnDynamicTableEvent(event, index, grid) if not self.Proxy then XLog.Warning("XDynamicTableNormal Proxy is nil,Please Setup First!!") return end if not self.Delegate then XLog.Warning("XDynamicTableNormal Delegate is nil,Please Setup First!!") return end if not self.Delegate.OnDynamicTableEvent and not self.DynamicEventDelegate then XLog.Warning("XDynamicTableNormal Delegate func OnDynamicTableEvent is nil,Please Setup First!!") return end --使用代理器,Lua代理器是一个 Table,IL使用C#脚本 local proxy = nil if grid ~= nil then proxy = self.ProxyMap[grid] if not proxy then proxy = self.Proxy.New(grid, table.unpack(self.ProxyArgs)) self.ProxyMap[grid] = proxy --初始化只调动一次 proxy.Index = index proxy.DynamicGrid = grid if self.DynamicEventDelegate then self.DynamicEventDelegate(DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT, index, proxy) else self.Delegate.OnDynamicTableEvent(self.Delegate, DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT, index, proxy) end end end if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then proxy.Index = index proxy.DynamicGrid = grid self.ProxyImpMap[index] = proxy elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_RECYCLE then proxy.Index = -1 proxy.DynamicGrid = nil self.ProxyImpMap[index] = nil elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_RELOAD_COMPLETED then XEventManager.DispatchEvent(XEventId.EVENT_GUIDE_STEP_OPEN_EVENT, self.Imp.name) end if self.DynamicEventDelegate then self.DynamicEventDelegate(event, index, proxy) else self.Delegate.OnDynamicTableEvent(self.Delegate, event, index, proxy) end end --设置事件回调 function XDynamicTableNormal:SetDynamicEventDelegate(fun) self.DynamicEventDelegate = fun end --设置代理器 function XDynamicTableNormal:SetProxy(proxy, ...) self.ProxyMap = {} self.ProxyImpMap = {} self.Proxy = proxy self.ProxyArgs = {...} end --设置总数 function XDynamicTableNormal:SetTotalCount(totalCout) if not self.Imp then return end self.Imp:SetTotalCount(totalCout) end --设置总数 function XDynamicTableNormal:SetDataSource(datas) if not datas or not self.Imp then return end self.DataSource = datas self.Imp:SetTotalCount(#self.DataSource) end --获取代理器 function XDynamicTableNormal:GetGridByIndex(index) return self.ProxyImpMap[index] end --获取所有代理器 function XDynamicTableNormal:GetGrids() return self.ProxyImpMap end --设置可视区域 function XDynamicTableNormal:SetViewSize(viewSize) if not self.Imp then return end self.Imp:SetViewSize(viewSize) end --刷新可视区域 function XDynamicTableNormal:UpdateViewSize() if not self.Imp then return end self.Imp:SetViewSize(self.Imp.rectTransform.rect.size) end --同步重载数据 function XDynamicTableNormal:ReloadDataSync(startIndex, forceReload) startIndex = startIndex or -1 if not self.Imp then return end if forceReload == nil then forceReload = true end self.Imp:ReloadDataSync(startIndex, forceReload) end --异步重载数据 function XDynamicTableNormal:ReloadDataASync(startIndex, forceReload) startIndex = startIndex or -1 if not self.Imp then return end if forceReload == nil then forceReload = true end self.Imp:ReloadDataAsync(startIndex, forceReload) end --是否异步加载中 function XDynamicTableNormal:IsAsyncLoading() return self.Imp.IsAsyncLoading and true or false end --回收所有节点 function XDynamicTableNormal:RecycleAllTableGrid() if not self.Imp then return end self.Imp:RecycleAllTableGrid() end --清空节点 function XDynamicTableNormal:Clear() if not self.Imp then return end self.Imp:Clear() end --设置节点大小 function XDynamicTableNormal:SetGridSize(GridSize) if not self.Imp then return end self.Imp.OriginGridSize = GridSize end function XDynamicTableNormal:GetGridSize() return self.Imp and self.Imp.GridSize end function XDynamicTableNormal:CenterToSelected(gameObject,time,cb) if not self.Imp then return end self.Imp:CenterToSelected(gameObject,time,cb) end function XDynamicTableNormal:GuideGetDynamicTableIndex(key, id) if not self.DataSource then return -1 end if (not key or key == "") then return self.Delegate:GuideGetDynamicTableIndex(id) end for i, v in ipairs(self.DataSource) do if (type(v) ~= "table" and tostring(v) == id) or (type(v) == "table" and tostring(v[key]) == id) then return i end end XLog.Error("Can not find key:" .. key .. " Value:" .. tostring(id) .. " in DataSource ") return -1 end function XDynamicTableNormal:SetPadding(left,right,top,bottom) if not self.Imp then return end self.Imp.Padding.left = left or self.Imp.Padding.left self.Imp.Padding.right = right or self.Imp.Padding.right self.Imp.Padding.top = top or self.Imp.Padding.top self.Imp.Padding.bottom = bottom or self.Imp.Padding.bottom end function XDynamicTableNormal:Freeze() if not self.Imp then return end self.Imp:Freeze() end function XDynamicTableNormal:SetGrid(grid) self.Imp.Grid = grid end function XDynamicTableNormal:GetData(index) return self.DataSource[index] end --todo 其他布局接口这里暂时不一一实现,因为布局属性在编辑阶段已经设置过 return XDynamicTableNormal