cocos2dx-lua 实现tableView来加载大量的Item,弃用listView啦
2017-10-25 21:36
459 查看
引言
经过几天的努力初步做了个类似好友系统,可以添加、删除好友!打包测试时,直接在后台导入了300+的好友,导致成员列表,直接卡到闪退!立刻想到就是这个listView惹的祸!原来这个控件一次性克隆了全部的item导致的,占用了太多内存,listView在这里显得很不适用!这时想到了TableView,于是尝试用代码创建了这个控件,感觉还是很给力的,立即解决了这个问题。为了方便后续使用,现在记录下来!不足之处,望请指正。代码片段1
--创建TableView function funA:createTableView(handleType,callBack) local membersTableView = cc.TableView:create(cc.size(self.listMembers:getContentSize().width,self.listMembers:getContentSize().height)) membersTableView:registerScriptHandler(function (membersTableView) return self:numberOfCell(membersTableView) end,cc.NUMBER_OF_CELLS_IN_TABLEVIEW) membersTableView:registerScriptHandler(function (membersTableView,index) return self:sizeForIndex(membersTableView,index) end,cc.TABLECELL_SIZE_FOR_INDEX) membersTableView:registerScriptHandler(function (membersTableView,index) return self:cellAtIndex(membersTableView,index) end,cc.TABLECELL_SIZE_AT_INDEX) membersTableView:registerScriptHandler(function (membersTableView,cell) Log:debug("funA createTableView:TABLECELL_TOUCHED") end,cc.TABLECELL_TOUCHED) return membersTableView end --创建cell的数量 function funA:numberOfCell(tableView) local numberOfCell = 0 local membersArr = ClubData._creatClubInfo.MemberInfoArr if not ClubData._creatClubInfo.MemberInfoArr then return 0 end --向上取整数 numberOfCell = math.ceil(#membersArr / 2) --由于这里我们一排并列显示两个成员 return numberOfCell end --索引项目大小 function funA:sizeForIndex(tableView,index) return self.listMembersItem:getContentSize().width,self.listMembersItem:getContentSize().height end --cell function funA:cellAtIndex(tableView,index) local cell = tableView:cellAtIndex(index) if not cell then cell = cc.TableViewCell:new() --会员信息赋值 ClubData._clubMembersArr[index * 2] ,ClubData._clubMembersArr[index * 2 -1] local memberInfoArr = ClubData._clubMembersArr local listViewItem = self.listMembersItem:clone() listViewItem:setVisible(true) local item = nil local idx = (index+1) * 2 if memberInfoArr[idx -1] then item = self:cloneOneItem(memberInfoArr[idx -1],cc.p(8,5)) listViewItem:addChild(item) end if memberInfoArr[idx] then item = self:cloneOneItem(memberInfoArr[idx],cc.p(8 + item:getContentSize().width + 8,5)) listViewItem:addChild(item) end listViewItem:setPosition(cc.p(0,0)) cell:addChild(listViewItem) end return cell end function funA:cloneOneItem(intemInfo,pos) local item = self.panelMemberItem:clone() item:setVisible(true) self:memberInfo(item,intemInfo) --会员信息赋值 item:setPosition(pos) item:setTag(intemInfo.UserID) item:setSwallowTouches(false) item:addClickEventListener(handler(self,funA.onClickEvent)) --这里我们可以添加要处理的事件 return item end --会员信息 排序 function funA:membersSort(memberInfoArr) Log:debug("funA:membersSort") --信息页面 self.membersTableView:reloadData() end function funA:memberInfo(item,memberInfo) --这里我们也可以添加要处理的事件,也可以用来给每一个Item赋值 --会员昵称 local txtPlayerName = ccui.Helper:seekWidgetByName_(item,"Text_playerName") txtPlayerName:setString(memberInfo.NickName) --会员ID local txtPlayerID = ccui.Helper:seekWidgetByName_(item,"Text_playerID") if txtPlayerID then txtPlayerID:setString("ID:"..memberInfo.UserID) end end
到这里我们就可以创建tableView了
代码片段2
self.membersTableView = self:createTableView() self.membersTableView:setPosition(self.listMembers:getPosition()) self.membersTableView:setVisible(true) self.membersTableView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL) self.membersTableView:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN) self.membersTableView:setAnchorPoint(cc.p(0,0)) self.membersTableView:setLocalZOrder(1000) self.panelMemberDown:addChild(self.membersTableView)是不是创建出来一个tableView了?如果没有,那可能是以下几种可能:
1、没有调用tableView的reloadData()方法,只有使用了这个方法,才有数据的哦(很重要)
2、确保创建的tableView的层级没有被遮挡,并且是可见的
美中不足的是cocos创建的这个tableView也是有bug的,如果你的这个tableView有点击事件,不妨你上下滑动几下item,然后在隐藏的上下方点击,是不是仍然有点击事件呢?简单一招,添加Panel遮挡,勾上交互性轻松搞定!
listView裁切了就不会有这种问题的存在,也是可视化的,但是只能加载少量的item,多了就会很卡,我也不想修改这个listView直接就拿着tableView用起来,感觉还是可以的!如果能把二者结合起来就好了!
=================================== the end ====================================
好了,今天的分享就到这里,如有不足之处,还望大家及时指正,随时欢迎探讨交流!!!
相关文章推荐
- cocos2dx ListView 大量 Item 加载方案(转)
- cocos2dx ListView 大量 Item 加载方案
- Android 用HorizontalScrollView实现ListView的Item滑动删除
- 自定义tableview实现:下拉刷新,上拉加载
- iPhone table 实现动态加载图片的教程-TableView中图片的延时加载
- Android中Recyclerview使用13----实现瀑布流遇到的各种问题(item移动,加载更多图片闪烁,以及定制各种类型Header和Footer)
- 【Android】Glide结合Recyclerview(也适用于Listview)实现列表滑动的时候图片不加载,滑动停止的时候加载(已修正Listview部分以及排版)
- RecyclerView实现上拉刷新,下拉加载,item点击事件
- ListVIew 中加载多个item 布局的covertView复用问题
- RecyclerView实现Item滑动加载进入动画效果
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
- 通过ViewDragHelper实现ListView的Item的侧拉划出效果
- listView加载大量数据的优化(之尾布局实现分页加载更多)
- cocos2d-x lua开发笔 3ff0 记:ListView加载多个item优化处理 (转)
- ListView实现item的卡片效果(不使用RecyclerView+CardView)
- Android腾讯微博客户端开发5:利用FootView实现ListView滑动动态加载实现分页
- cocos2d-lua+cocos studio之ListView加载Item
- 用tableView实现的一种加载数据的布局
- 实现TableView的上拉加载和下拉刷新
- Android腾讯微博客户端开发五:利用FootView实现ListView滑动动态加载实现分页