forked from endernon/PGRData
274 lines
9 KiB
Lua
274 lines
9 KiB
Lua
|
XDynamicList = XClass(nil, "XDynamicList")
|
||
|
|
||
|
DLDelegateEvent = {
|
||
|
DYNAMIC_GRID_TOUCHED = 5,
|
||
|
DYNAMIC_GRID_ATINDEX = 6,
|
||
|
DYNAMIC_GRID_RECYCLE = 7,
|
||
|
}
|
||
|
|
||
|
DLInsertDataDir = {
|
||
|
None = 0,
|
||
|
Head = 1,
|
||
|
Tail = 2,
|
||
|
}
|
||
|
|
||
|
DLScrollDataDir = {
|
||
|
None = 0,
|
||
|
Head = 1,
|
||
|
Tail = 2
|
||
|
}
|
||
|
|
||
|
function XDynamicList:DebugLog(...)
|
||
|
if self.showLog then
|
||
|
XLog.Error(...)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XDynamicList:Ctor(ui)
|
||
|
self.GameObject = ui.gameObject
|
||
|
self.Transform = ui.transform
|
||
|
self.ItemCache = {}
|
||
|
|
||
|
self.showLog = false
|
||
|
|
||
|
self:ResetData()
|
||
|
self:InitView()
|
||
|
end
|
||
|
|
||
|
function XDynamicList:ResetData()--重置数据
|
||
|
self.Data = {}
|
||
|
self.curDataMaxIndex = 0--当前数据最大的索引
|
||
|
self.dataHeadIndex = -1 --当前数据头索引
|
||
|
self.dataTailIndex = -1--当前数据尾索引
|
||
|
self.NodeListData = {}
|
||
|
|
||
|
self.curShowHeadIndex = -1--当前展示的头索引
|
||
|
self.curShowTailIndex = -1--当前展示的尾索引
|
||
|
end
|
||
|
|
||
|
function XDynamicList:InitView()
|
||
|
self.DynamicList = self.Transform:GetComponent("XVerticalDynamicList")
|
||
|
self.DynamicListBar = self.DynamicList.verticalScrollbar
|
||
|
if self.DynamicList == nil then
|
||
|
XLog.Error("Not Find XVerticalDynamicList Component!")
|
||
|
return
|
||
|
end
|
||
|
self.DynamicList:SetViewSize(self.Transform:GetComponent("RectTransform").rect.size)
|
||
|
end
|
||
|
|
||
|
function XDynamicList:SetData(data, cb, scrollCb)--设置数据
|
||
|
self:DebugLog("------数据初始化----", data)
|
||
|
self:ResetData()
|
||
|
self.CallBack = cb
|
||
|
self.ScrollCallBack = scrollCb --滑动回调
|
||
|
self.DynamicList.tableViewGridDelegate = function(evt, index, dir)
|
||
|
return self:GenerateItem(evt, dir, index)
|
||
|
end
|
||
|
self:FormatData(data)
|
||
|
end
|
||
|
|
||
|
function XDynamicList:FormatData(data)--格式化数据
|
||
|
if data == nil then
|
||
|
XLog.Error("------FormatData is error!------> data is nil! please check!")
|
||
|
return
|
||
|
end
|
||
|
self.dataHeadIndex = 1
|
||
|
self.dataTailIndex = #data
|
||
|
self.NodeListData = {}
|
||
|
for i = 1, self.dataTailIndex do
|
||
|
self.curDataMaxIndex = self.curDataMaxIndex + 1
|
||
|
local temp = {}
|
||
|
temp.data = data[i]
|
||
|
temp.index = self.curDataMaxIndex
|
||
|
temp.Pre = (i == 1) and -1 or self.curDataMaxIndex - 1
|
||
|
temp.Next = (i == #data) and -1 or self.curDataMaxIndex + 1
|
||
|
self.NodeListData[self.curDataMaxIndex] = temp
|
||
|
end
|
||
|
self:DebugLog("------FormatData------", self.NodeListData)
|
||
|
self:ReloadData()
|
||
|
end
|
||
|
|
||
|
function XDynamicList:ReloadData()
|
||
|
-- if #self.NodeListData <= 0 then
|
||
|
-- return
|
||
|
-- end
|
||
|
self.curShowTailIndex = -1
|
||
|
self.curShowHeadIndex = -1
|
||
|
self.DynamicList.TotalCount = #self.NodeListData
|
||
|
self.DynamicList:ReloadData(true)
|
||
|
self:DebugLog("------ReloadData------", self.NodeListData)
|
||
|
end
|
||
|
|
||
|
function XDynamicList:InsertData(insertData, dir, isReload)--插入数据
|
||
|
if #insertData == 0 then
|
||
|
XLog.Error("-----------insertData is null--------------")
|
||
|
return
|
||
|
end
|
||
|
local tempDataHeadIndex = self.dataHeadIndex
|
||
|
local tempDataTailIndex = self.dataTailIndex
|
||
|
for i = 1, #insertData do
|
||
|
self.curDataMaxIndex = self.curDataMaxIndex + 1
|
||
|
local temp = {}
|
||
|
temp.data = insertData[i]
|
||
|
temp.index = self.curDataMaxIndex
|
||
|
if dir == DLInsertDataDir.Head then
|
||
|
temp.Pre = (i == 1) and -1 or self.curDataMaxIndex - 1
|
||
|
if #self.NodeListData == 0 then
|
||
|
temp.Next = -1
|
||
|
else
|
||
|
temp.Next = (i == #insertData) and self.dataHeadIndex or self.curDataMaxIndex + 1
|
||
|
end
|
||
|
if i == 1 then
|
||
|
tempDataHeadIndex = self.curDataMaxIndex
|
||
|
end
|
||
|
if i == #insertData and #self.NodeListData > 0 then
|
||
|
self.NodeListData[self.dataHeadIndex].Pre = self.curDataMaxIndex
|
||
|
end
|
||
|
elseif dir == DLInsertDataDir.Tail then
|
||
|
if #self.NodeListData == 0 then
|
||
|
temp.Pre = -1
|
||
|
else
|
||
|
temp.Pre = (i == 1) and self.dataTailIndex or self.curDataMaxIndex - 1
|
||
|
end
|
||
|
temp.Next = (i == #insertData) and -1 or self.curDataMaxIndex + 1
|
||
|
if i == 1 and #self.NodeListData > 0 then
|
||
|
self.NodeListData[self.dataTailIndex].Next = self.curDataMaxIndex
|
||
|
end
|
||
|
if i == #insertData then
|
||
|
tempDataTailIndex = self.curDataMaxIndex
|
||
|
end
|
||
|
end
|
||
|
self.NodeListData[self.curDataMaxIndex] = temp
|
||
|
end
|
||
|
self.dataHeadIndex = tempDataHeadIndex
|
||
|
self.dataTailIndex = tempDataTailIndex
|
||
|
self:AddTotalCount(#insertData, dir)
|
||
|
if isReload then
|
||
|
self:ReloadData()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XDynamicList:AddTotalCount(addCount, dir)
|
||
|
self.DynamicList.TotalCount = self.DynamicList.TotalCount + addCount;
|
||
|
if dir == DLInsertDataDir.Head then
|
||
|
self.DynamicList.StartIndex = self.DynamicList.StartIndex + addCount
|
||
|
-- self.DynamicList.EndIndex = self.DynamicList.EndIndex + addCount
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XDynamicList:GenerateItem(evt, dir, index)
|
||
|
if self.DynamicListBar then
|
||
|
if self:GetBarValue() <= 0 then--拉到底了
|
||
|
XEventManager.DispatchEvent(XEventId.EVENT_PULL_SCROLLVIEW_END, 0)
|
||
|
-- 添加新事件系统触发
|
||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_PULL_SCROLLVIEW_END, 0)
|
||
|
elseif self:GetBarValue() >= 1 then--拉到顶了
|
||
|
XEventManager.DispatchEvent(XEventId.EVENT_PULL_SCROLLVIEW_UP, 0)
|
||
|
-- 添加新事件系统触发
|
||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_PULL_SCROLLVIEW_UP, 0)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if self.ScrollCallBack then
|
||
|
self.ScrollCallBack()
|
||
|
end
|
||
|
|
||
|
if not self.CallBack then
|
||
|
XLog.Error("You must be set callBack......")
|
||
|
return
|
||
|
end
|
||
|
if evt == DLDelegateEvent.DYNAMIC_GRID_ATINDEX then
|
||
|
if #self.NodeListData == 0 then
|
||
|
return true
|
||
|
end
|
||
|
local curShowDataIndex = nil--下一个需要展示的数据index
|
||
|
if dir == DLScrollDataDir.Head then
|
||
|
if not self.NodeListData[self.curShowHeadIndex] then
|
||
|
return true
|
||
|
end
|
||
|
if self.NodeListData[self.curShowHeadIndex].Pre == -1 then
|
||
|
return true
|
||
|
end
|
||
|
self.curShowHeadIndex = self.NodeListData[self.curShowHeadIndex].Pre
|
||
|
curShowDataIndex = self.curShowHeadIndex
|
||
|
elseif dir == DLScrollDataDir.Tail then
|
||
|
if self.curShowTailIndex == -1 and self.curShowHeadIndex == -1 then
|
||
|
self.curShowHeadIndex = self.dataHeadIndex
|
||
|
self.curShowTailIndex = self.dataHeadIndex
|
||
|
else
|
||
|
if not self.NodeListData[self.curShowTailIndex] then
|
||
|
return true
|
||
|
end
|
||
|
if self.NodeListData[self.curShowTailIndex].Next == -1 then
|
||
|
return true
|
||
|
end
|
||
|
self.curShowTailIndex = self.NodeListData[self.curShowTailIndex].Next
|
||
|
end
|
||
|
curShowDataIndex = self.curShowTailIndex
|
||
|
end
|
||
|
self.CallBack(self.NodeListData[curShowDataIndex].data, function(poolName, ctor)
|
||
|
local item = self.DynamicList:PreDequeueGrid(poolName, index)
|
||
|
local xlayoutNode = item:GetComponent("XLayoutNode")
|
||
|
if self.DynamicList and xlayoutNode then
|
||
|
xlayoutNode.minSize = CS.UnityEngine.Vector2(self.DynamicList.transform:GetComponent("RectTransform").rect.width, 0)
|
||
|
end
|
||
|
if item == nil then
|
||
|
XLog.Error("GenerateItem is Fail......index = ", index)
|
||
|
return false
|
||
|
end
|
||
|
local key = item.gameObject:GetHashCode()
|
||
|
local itemScript = self.ItemCache[key]
|
||
|
if itemScript ~= nil then
|
||
|
return itemScript
|
||
|
else
|
||
|
local newItemScript = ctor(item.gameObject)
|
||
|
self.ItemCache[key] = newItemScript
|
||
|
return newItemScript
|
||
|
end
|
||
|
|
||
|
end)
|
||
|
return false
|
||
|
elseif evt == DLDelegateEvent.DYNAMIC_GRID_RECYCLE then
|
||
|
if dir == DLScrollDataDir.Head then
|
||
|
self.curShowHeadIndex = self.NodeListData[self.curShowHeadIndex].Next
|
||
|
elseif dir == DLScrollDataDir.Tail then
|
||
|
self.curShowTailIndex = self.NodeListData[self.curShowTailIndex].Pre
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
--------------------------Set-------------------
|
||
|
function XDynamicList:SetReverse(code)
|
||
|
self.DynamicList.Reverse = code
|
||
|
end
|
||
|
|
||
|
function XDynamicList:SetBarValue(value)
|
||
|
self.DynamicListBar.value = value
|
||
|
end
|
||
|
|
||
|
function XDynamicList:SetViewSize(rectSize, isReload)
|
||
|
self.DynamicList:SetViewSize(rectSize)
|
||
|
if isReload then
|
||
|
self:ReloadData()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
---------------------------Get-----------------
|
||
|
function XDynamicList:GetBarValue()
|
||
|
if self.DynamicListBar then
|
||
|
return self.DynamicListBar.value
|
||
|
else
|
||
|
XLog.Error("------DynamicList Not ScrollBar Component!------")
|
||
|
return nil
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XDynamicList:GetCurDataCount()
|
||
|
return #self.NodeListData
|
||
|
end
|
||
|
|
||
|
function XDynamicList:AddObjectPools(poolName, prefab)
|
||
|
self.DynamicList.ObjectPool:Add(poolName, prefab)
|
||
|
end
|