listview 和 tableview经常会用到,两个东西的区别也不是很大但还是有的,前者是有多少条数据就创建多少个子项,后者是创建固定数量的子项,然后通过滚动展示不同的数据,不断地覆盖。所以在数据很多的时候一般会选用tableview.
listview 创建
我是基于cocosStudio的方法,用cocosStudio创建一个listview,选择合适的尺寸。
再建立单独的个项,使用一个panel也就是基础容器存放,当然也可以不用,图片也可以承载
代码获取列表容器 listview_items 和个项 listview_item ,全局存储,当然也可以局部变量
function showListView(data)
local item = nil
for k,v in pairs(data.tasks or {}) do
---克隆子项,因为每个子项都相同,没必要去创建很多,创建一个克隆就可以了
item =self.listview_item:clone()
item:setPosition(cc.p(0,0))--设置位置
self.listview_items:pushBackCustomItem(item) ----listview内部方法,添加一个子控件
---------这里就可以根据传过来的数据设定每个子项的内容了
end
end
listview内部也有很多方法,比如说打开跳到底部(jumpToBottom())啊之类的,可以去看看源码
如果需要每个子项根据文本的宽度自动设置大小,就设置item的宽度就可以了,setContentSize()
tableview 创建
tableview创建有四个 方法,滚动函数,子项尺寸,列表项数量和创建列表
local tableview = cc.TableView:create(self.panel_list:getContentSize())
tableview:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN);
tableview:setDelegate()
-- -- tableView:registerScriptHandler( handler(self, self.tableCellTouched), cc.TABLECELL_TOUCHED )
tableview:registerScriptHandler( handler(self, self.scrollViewDidScroll),cc.SCROLLVIEW_SCRIPT_ZOOM)--滚动时的回掉函数
tableview:registerScriptHandler( handler(self, self.cellSizeForTable), cc.TABLECELL_SIZE_FOR_INDEX) --列表项的尺寸
tableview:registerScriptHandler( handler(self, self.tableCellAtIndex), cc.TABLECELL_SIZE_AT_INDEX) --创建列表项
tableview:registerScriptHandler( handler(self, self.numberOfCellsInTableView), cc.NUMBER_OF_CELLS_IN_TABLEVIEW)--列表项的数量
self.panel_list:addChild(tableview)
依然使用studio,不同的是创建tableview放置的不是列表容器,而是基础容器,个项依然克隆
回调函数内部不用写什么,放着就行了。
列表项尺寸就是返回一个size()
列表项数量返回一个整数,我一般返回#data(就是要展示的table表的数据条数)
创建列表项是最重要的
function tableCellAtIndex(view, idx)
local index = idx+1
local cell = view:dequeueCell()
local item = nil
local data = nil
if nil == cell then
cell = cc.TableViewCell:new()
if index < #viewData+ 1 then
data = viewData[index]
if data then
local item = self.item:clone()
item:setVisible(true)
item:setPosition(cc.p(0,0))
item:setTag(index)
cell:addChild(item)
self:setPropetry(item,data,index)
else
cell:removeAllChildren()
end
else
cell:removeAllChildren()
end
else
item = cell:getChildByTag(index)
if item == nil then
cell:removeAllChildren()
item = self.item:clone()
item:setVisible(true)
item:setPosition(cc.p(0,0))
item:setTag(index)
cell:addChild(item)
end
if index < #viewData+ 1 then
data = viewData[index]
self:setPropetry(item,data,index)
else
cell:removeAllChildren()
end
end
return cell
end
self:setPropetry(item,data,index) 是我写的设置个项的属性
可以看到tableview就是一个根据tag不断覆盖数据的过程,从而达到节约内存的效果