cocos-lua3.17 Lua tableView工具类

local MyTableView = class("MyTableView")
MyTableView.__index = MyTableView

MyTableView.property = {}

--这里是为了让layer能调用TableViewTestLayer的方法
function MyTableView.extend(target)
    local t = tolua.getpeer(target)
    if not t then
        t = {}
        tolua.setpeer(target, t)
    end
    setmetatable(t, MyTableView)
    return target
end

--滚动事件
function MyTableView.scrollViewDidScroll(view)
    --print("滚动事件")
end

function MyTableView.scrollViewDidZoom(view)
    print("scrollViewDidZoom")
end

--cell点击事件
function MyTableView.tableCellTouched(table,cell)
    print("点击了cell:" .. cell:getIdx())
end

--cell的大小,注册事件就能直接影响界面,不需要主动调用
function MyTableView.cellSizeForTable(table,idx)
    if MyTableView.property.cellSizeW and MyTableView.property.cellSizeH then
        return MyTableView.property.cellSizeW,MyTableView.property.cellSizeH
    end
    return 150,150
end

--显示出可视部分的界面,出了裁剪区域的cell就会被复用
function MyTableView.tableCellAtIndex(table, idx)
    local strValue = string.format("%d",idx)
    print("数据加载"..strValue)
    local cell = table:dequeueCell()
    local label = nil
    if nil == cell then
        print("创建了新的cell")
        cell = cc.TableViewCell:new()

        --添加cell内容
        -- local sprite = display.newSprite("res/apple.png")
        -- sprite:setAnchorPoint(cc.p(0,0))
        -- sprite:setPosition(cc.p(0, 0))
        -- cell:addChild(sprite)

        label = cc.Label:createWithSystemFont(strValue, "Helvetica", 40)
        label:setPosition(cc.p(0,0))
        label:setAnchorPoint(cc.p(0,0))
        label:setColor(cc.c3b(255,0,0))
        label:setTag(123)
        cell:addChild(label)
    else
        print("使用已经创建过的cell")
        label = cell:getChildByTag(123)
        if nil ~= label then
            label:setString(strValue)
        end
    end

    return cell
end

--设置cell个数,注册就能生效,不用主动调用
function MyTableView.numberOfCellsInTableView(table)
    if MyTableView.property.cellNum then
        return MyTableView.property.cellNum
    end
    return 100
end

function MyTableView:init()

    local visiableSize = cc.Director:getInstance():getVisibleSize()
    local origin = cc.Director:getInstance():getVisibleOrigin()

    local winSize = cc.Director:getInstance():getWinSize()

    local isVERTICAL = MyTableView.property.isVERTICAL

    local tableSize = isVERTICAL==true and cc.size(winSize.width - 20,150) or cc.size(200, winSize.height - 20)
    if MyTableView.property.tableSize then
        tableSize = MyTableView.property.tableSize
    end
    if isVERTICAL then
        -----------------------------------------------------------
        --创建TableView

        local tableView = cc.TableView:create(tableSize)
        --设置滚动方向  水平滚动
        tableView:setDirection(cc.SCROLLVIEW_DIRECTION_HORIZONTAL)
        -- tableView:setPosition(cc.p(10, winSize.height / 2))
        tableView:setDelegate()
        self:addChild(tableView)
        --registerScriptHandler functions must be before the reloadData funtion
        --注册脚本编写器函数必须在reloadData函数之前(有道自动翻译)

        --cell个数
        tableView:registerScriptHandler(MyTableView.numberOfCellsInTableView,cc.NUMBER_OF_CELLS_IN_TABLEVIEW)
        --滚动事件
        tableView:registerScriptHandler(MyTableView.scrollViewDidScroll,cc.SCROLLVIEW_SCRIPT_SCROLL)
        tableView:registerScriptHandler(MyTableView.scrollViewDidZoom,cc.SCROLLVIEW_SCRIPT_ZOOM)
        --cell点击事件
        tableView:registerScriptHandler(MyTableView.tableCellTouched,cc.TABLECELL_TOUCHED)
        --cell尺寸、大小
        tableView:registerScriptHandler(MyTableView.cellSizeForTable,cc.TABLECELL_SIZE_FOR_INDEX)
        --显示出可视部分的cell
        tableView:registerScriptHandler(MyTableView.tableCellAtIndex,cc.TABLECELL_SIZE_AT_INDEX)
        --调用这个才会显示界面
        tableView:reloadData()
        -----------------------------------------------------------

    else

        -----------------------------------------------------------
        --跟上面差不多,这里是创建一个“垂直滚动”的TableView
        tableView = cc.TableView:create(tableSize)
        tableView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL)
        -- tableView:setPosition(cc.p(winSize.width / 2, 10))
        tableView:setDelegate()
        tableView:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN)
        self:addChild(tableView)
        --registerScriptHandler functions must be before the reloadData funtion
        --注册脚本编写器函数必须在reloadData函数之前(有道自动翻译)

        --cell个数
        tableView:registerScriptHandler(MyTableView.numberOfCellsInTableView,cc.NUMBER_OF_CELLS_IN_TABLEVIEW)
        --滚动事件
        tableView:registerScriptHandler(MyTableView.scrollViewDidScroll,cc.SCROLLVIEW_SCRIPT_SCROLL)
        tableView:registerScriptHandler(MyTableView.scrollViewDidZoom,cc.SCROLLVIEW_SCRIPT_ZOOM)
        --cell点击事件
        tableView:registerScriptHandler(MyTableView.tableCellTouched,cc.TABLECELL_TOUCHED)
        --cell尺寸、大小
        tableView:registerScriptHandler(MyTableView.cellSizeForTable,cc.TABLECELL_SIZE_FOR_INDEX)
        --显示出可视部分的cell
        tableView:registerScriptHandler(MyTableView.tableCellAtIndex,cc.TABLECELL_SIZE_AT_INDEX)
        --调用这个才会显示界面
        tableView:reloadData()
        -----------------------------------------------------------

    end

    return true
end

--这里是为了让layer能调用TableViewTestLayer的方法
function MyTableView.create(tableSize,cellSizeW,cellSizeH,cellNum,isVERTICAL)
    MyTableView.property.cellSizeW = cellSizeW--Item宽度
    MyTableView.property.cellSizeH = cellSizeH--Item长度
    MyTableView.property.cellNum = cellNum--Item数量
    MyTableView.property.isVERTICAL = isVERTICAL--true 水平滑动 
    MyTableView.property.tableSize = tableSize--显示区域大小 cc.size()

    local layer = MyTableView.extend(cc.Layer:create())
    if nil ~= layer then
        layer:init()
    end

    return layer
end

return MyTableView
原文地址:https://www.cnblogs.com/zhangthree/p/10507995.html