TableView的使用方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pyf_914406232/article/details/79152935

TableView的使用方法

类:TableViewTestLayer

local TableViewTestLayer = class("TableViewTestLayer")

TableViewTestLayer.__index = TableViewTestLayer

function TableViewTestLayer.extend(target)

    local t = tolua.getpeer(target)

    if not t then

        t = {}

        tolua.setpeer(target, t)

    end

    setmetatable(t, TableViewTestLayer)

    return target

end

--点击cell的时候点击回调函数

function TableViewTestLayer.tableCellTouched(table,cell)

    print("cell touched at index: " .. cell:getIdx()+1)

    local prompt = GamePromptLayer:create();

    prompt:showPrompt(GBKToUtf8("你点击的是"..cell:getIdx()+1)); --

end

--一个cell的大小

function TableViewTestLayer.cellSizeForTable(table,idx)

    return 323,75

end

--创建cell用户可以再cell上添加其他的节点

function TableViewTestLayer.tableCellAtIndex(table, idx)

    local strValue = string.format("%d",idx+1)

    local cell = table:dequeueCell()

    local label = nil

    print("------------------idx-----------------",idx+1);

    if nil == cell then

        cell = cc.TableViewCell:new()

        -- local sprite = cc.Sprite:create("ranking/kuang-ziji.png")

        -- sprite:setAnchorPoint(cc.p(0,0))

        -- sprite:setPosition(cc.p(50, 100))

        -- cell:addChild(sprite)

        local node = RankNode.new();--RankNode 这个是我自己创建的节点 大小(323,75)

        node:setPosition(cc.p(323/2, 75/2))

        cell:addChild(node);

        local but = ccui.Button:create("distance/guanbi.png")

        node:addChild(but);

        --but:setEnabled(false)

        --but:setSwallowTouches(false);

        --but:addClickEventListener(handler(self,function(sender, eventType) if eventType then print("点击到了按钮",eventType)  end end));

        --这里是为了试验添加按钮上去会不会有触摸的问题,结果是会有这样的问题

        label = cc.Label:createWithSystemFont(strValue, "Helvetica", 20.0)

        label:setPosition(cc.p(0,75/2))

        label:setAnchorPoint(cc.p(0,0.5))

        label:setTag(123)

        cell:addChild(label)

    else

        label = cell:getChildByTag(123)

        if nil ~= label then

            label:setString(strValue)

        end

    end

    return cell

end

--指定创建cell的个数

function TableViewTestLayer.numberOfCellsInTableView(table)

   return 50

end

function TableViewTestLayer:init()

    math.randomseed(os.time())

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

    tableView = cc.TableView:create(cc.size(323, 750*0.6))

    tableView:setAnchorPoint(cc.p(0,0));

    tableView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL)--cc.SCROLLVIEW_DIRECTION_HORIZONTAL横屏

    tableView:setPosition(cc.p(winSize.width*0, winSize.height*0 ))

    tableView:setDelegate()

    tableView:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN)

    self:addChild(tableView)

    --tableView:registerScriptHandler(TableViewTestLayer.scrollViewDidScroll,cc.SCROLLVIEW_SCRIPT_SCROLL)

    --tableView:registerScriptHandler(TableViewTestLayer.scrollViewDidZoom,cc.SCROLLVIEW_SCRIPT_ZOOM)

    tableView:registerScriptHandler(TableViewTestLayer.tableCellTouched,cc.TABLECELL_TOUCHED)

    tableView:registerScriptHandler(TableViewTestLayer.cellSizeForTable,cc.TABLECELL_SIZE_FOR_INDEX)

    tableView:registerScriptHandler(TableViewTestLayer.tableCellAtIndex,cc.TABLECELL_SIZE_AT_INDEX)

    tableView:registerScriptHandler(TableViewTestLayer.numberOfCellsInTableView,cc.NUMBER_OF_CELLS_IN_TABLEVIEW)

    tableView:reloadData()

    

    return true

end

function TableViewTestLayer.create()

    local layer = TableViewTestLayer.extend(cc.Layer:create())

    if nil ~= layer then

        layer:init()

    end

    return layer

End

类代码都在这里了,拿去直接就可以用了,如下:

local newLayer = TableViewTestLayer.create()

self:addChild(newLayer)

 

虽然有listView和SrollView二个控件,二者在使用数量不是很多的情况下,是没有问题的,但是如果数量上百上千个的话,性能可能就不行了,这个时候就需要用TableView控件了.用tableView的话最好不要用按钮,因为按钮也会出现问题。废话懒得说了,直接看代码

今天遇到一个需求,说是初始化的时候默认显示最下面的几个cell,方法也有,在网上找到,这里记录一下:

首先获取getContentOffset坐标,然后在重新设置一下偏移量:setContentOffset

具体例子如下:

        if self.rankTableView then
local currOffSet = self.rankTableView:getContentOffset();
currOffSet.y = 0;
self.rankTableView:setContentOffset(currOffSet);

end

rankTableView 是一个tableview控件,这样就完成了默认显示最下面的几个cell.

再提供一个方法:

--tableview的reloadData后的坐标问题(上下滚动)isNeedFlush是否需要滚动到顶
function LuZiLayer:CommomFunc_TableViewReloadData_Vertical(pTableView, singleCellSize, isNeedFlush)
    if isNeedFlush == true then
        -- 直接重新加载数据
        pTableView:reloadData();
    else
        -- 需要设定位置
        local currOffSet = pTableView:getContentOffset();
        local viewSize = pTableView:getViewSize();
        -- 重新加载数据
        pTableView:reloadData();
        -- 获取大小
        local contentSize = pTableView:getContentSize();
        -- 如果tableview内尺寸大于可视尺寸,需要设定当前的显示位置
        if contentSize.height > viewSize.height then
            -- 
            local minPointY = viewSize.height - contentSize.height;
            local maxPointY = 0;
            if currOffSet.y < minPointY then
                currOffSet.y = minPointY;
            elseif currOffSet.y > maxPointY then
                currOffSet.y = maxPointY;
            end
            currOffSet.x = minPointX; -- 横向tableview

            --currOffSet.y = 0; --纵向tableview
            pTableView:setContentOffset(currOffSet);
        end
    end    
end

猜你喜欢

转载自blog.csdn.net/pyf_914406232/article/details/79152935
今日推荐