lua listview和tableview

琴宾鸿
2023-12-01

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不断覆盖数据的过程,从而达到节约内存的效果


 类似资料: