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