您的位置:首页 > 产品设计 > UI/UE

quick(3.2) UIListView扩展

2016-03-14 16:07 756 查看

前言

  listview列表,在游戏中非常常见,比如道具列表,玩家列表,排行榜等等。每个版本可能使用方法可能有些差别,但是大同小异,原理和用途都是那几种,设置方向,间隔等。

这里是quick-lua3.3版本的使用和简单介绍.

UIListView继承自UIScrollView,掌握UIScrollView用法和源码是非常有必要滴

使用及几个用法

初始化listView

1.例子

self.listView=cc.ui.UIListView.new({
  direction=cc.ui.UIScrollView.DIRECTION_VERTICAL,
  alignment=cc.ui.UIListView.ALIGNMENT_VCENTER,
  viewRect=cc.rect(0,0,bg:getContentSize().width-28,bg:getContentSize().height-88),
})


2.参数

-direction列表控件的滚动方向,默认为垂直方向
-alignmentlistViewItem中content的对齐方式,默认为垂直居中
-viewRect列表控件的显示区域
-scrollbarImgH水平方向的滚动条
-scrollbarImgV垂直方向的滚动条
-bgColor背景色,nil表示无背景色
-bgStartColor渐变背景开始色,nil表示无背景色
-bgEndColor渐变背景结束色,nil表示无背景色
-bg背景图
-bgScale9背景图是否可缩放
-capInsets缩放区域


(1)direction


UIScrollView.DIRECTION_BOTH=0
UIScrollView.DIRECTION_VERTICAL=1--垂直
UIScrollView.DIRECTION_HORIZONTAL=2


(2)alignment


UIListView.ALIGNMENT_LEFT=0
UIListView.ALIGNMENT_RIGHT=1
UIListView.ALIGNMENT_VCENTER=2
UIListView.ALIGNMENT_TOP=3
UIListView.ALIGNMENT_BOTTOM=4
UIListView.ALIGNMENT_HCENTER=5



item、设置间隔:

1.使用:

localmargin={top=0,bottom=5,left=0,right=0}

locallistItem=self.listView:newItem(node)
listItem:setMargin(margin)--设置间隔(如果是玩家自己的话,就放大一点)
listItem:setItemSize(node:getContentSize().width,node:getContentSize().height)

setMargin原理


2.在设置itemsize时处理margin_

functionUIListViewItem:setItemSize(w,h,bNoMargin)
ifnotbNoMarginthen
ifUIScrollView.DIRECTION_VERTICAL==self.lvDirection_then
h=h+self.margin_.top+self.margin_.bottom
else
w=w+self.margin_.left+self.margin_.right
end
end

--print("UIListViewItem-setItemSizew:"..w.."h:"..h)

localoldSize={width=self.width,height=self.height}
localnewSize={width=w,height=h}

self.width=wor0
self.height=hor0
self:setContentSize(w,h)

localbg=self:getChildByTag(UIListViewItem.BG_TAG)
ifbgthen
bg:setContentSize(w,h)
bg:setPosition(cc.p(w/2,h/2))
end

self.listener(self,newSize,oldSize)
end


注:设置间隔可以直接

listItem:setItemSize(node:getContentSize().width,node:getContentSize().height+XXXXX)
直接加也可以

UIListView.lua函数

framework/cc/ui/文件夹下

--------------------------------
--@moduleUIListView

--[[--

  quick列表控件

]]

localUIScrollView=import(".UIScrollView")
localUIListView=class("UIListView",UIScrollView)

localUIListViewItem=import(".UIListViewItem")

UIListView.DELEGATE="ListView_delegate"
UIListView.TOUCH_DELEGATE="ListView_Touch_delegate"

UIListView.CELL_TAG="Cell"
UIListView.CELL_SIZE_TAG="CellSize"
UIListView.COUNT_TAG="Count"
UIListView.CLICKED_TAG="Clicked"
UIListView.UNLOAD_CELL_TAG="UnloadCell"

UIListView.BG_ZORDER=-1
UIListView.CONTENT_ZORDER=10

UIListView.ALIGNMENT_LEFT=0 UIListView.ALIGNMENT_RIGHT=1 UIListView.ALIGNMENT_VCENTER=2 UIListView.ALIGNMENT_TOP=3 UIListView.ALIGNMENT_BOTTOM=4 UIListView.ALIGNMENT_HCENTER=5

--start--

--------------------------------
--UIListView构建函数
--@function[parent=#UIListView]new
--@paramtableparams参数表

--[[--

UIListView构建函数

可用参数有:

-direction列表控件的滚动方向,默认为垂直方向 -alignmentlistViewItem中content的对齐方式,默认为垂直居中 -viewRect列表控件的显示区域 -scrollbarImgH水平方向的滚动条 -scrollbarImgV垂直方向的滚动条 -bgColor背景色,nil表示无背景色 -bgStartColor渐变背景开始色,nil表示无背景色 -bgEndColor渐变背景结束色,nil表示无背景色 -bg背景图 -bgScale9背景图是否可缩放 -capInsets缩放区域

]]
--end--

functionUIListView:ctor(params)
UIListView.super.ctor(self,params)

self.items_={}
self.direction=params.directionorUIScrollView.DIRECTION_VERTICAL
self.alignment=params.alignmentorUIListView.ALIGNMENT_VCENTER
self.bAsyncLoad=params.asyncorfalse
self.container=cc.Node:create()
--self.padding_=params.paddingor{left=0,right=0,top=0,bottom=0}

--params.viewRect.x=params.viewRect.x+self.padding_.left
--params.viewRect.y=params.viewRect.y+self.padding_.bottom
--params.viewRect.width=params.viewRect.width-self.padding_.left-self.padding_.right
--params.viewRect.height=params.viewRect.height-self.padding_.bottom-self.padding_.top

self:setDirection(params.direction)
self:setViewRect(params.viewRect)
self:addScrollNode(self.container)
self:onScroll(handler(self,self.scrollListener))

self.size={}
self.itemsFree_={}
self.delegate_={}
self.redundancyViewVal=0--异步的视图两个方向上的冗余大小,横向代表宽,竖向代表高
end

functionUIListView:onCleanup()
self:releaseAllFreeItems_()
end

--start--

--------------------------------
--列表控件触摸注册函数
--@function[parent=#UIListView]onTouch
--@paramfunctionlistener触摸临听函数
--@returnUIListView#UIListViewself自身

--end--

functionUIListView:onTouch(listener)
self.touchListener_=listener

returnself
end

--start--

--------------------------------
--列表控件设置所有listItem中content的对齐方式
--@function[parent=#UIListView]setAlignment
--@paramnumberalign对
--@returnUIListView#UIListViewself自身

--end--

functionUIListView:setAlignment(align)
self.alignment=align
end

--start--

--------------------------------
--创建一个新的listViewItem项
--@function[parent=#UIListView]newItem
--@paramnodeitem要放到listViewItem中的内容content
--@returnUIListViewItem#UIListViewItem

--end--

functionUIListView:newItem(item)
item=UIListViewItem.new(item)
item:setDirction(self.direction)
item:onSizeChange(handler(self,self.itemSizeChangeListener))

returnitem
end

--start--

--------------------------------
--设置显示区域
--@function[parent=#UIListView]setViewRect
--@returnUIListView#UIListViewself

--end--

functionUIListView:setViewRect(viewRect)
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
self.redundancyViewVal=viewRect.height
else
self.redundancyViewVal=viewRect.width
end

UIListView.super.setViewRect(self,viewRect)
end

functionUIListView:itemSizeChangeListener(listItem,newSize,oldSize)
localpos=self:getItemPos(listItem)
ifnotposthen
return
end

localitemW,itemH=newSize.width-oldSize.width,newSize.height-oldSize.height
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
itemW=0
else
itemH=0
end

localcontent=listItem:getContent()
transition.moveBy(content,
{x=itemW/2,y=itemH/2,time=0.2})

self.size.width=self.size.width+itemW
self.size.height=self.size.height+itemH
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
transition.moveBy(self.container,
{x=-itemW,y=-itemH,time=0.2})
self:moveItems(1,pos-1,itemW,itemH,true)
else
self:moveItems(pos+1,table.nums(self.items_),itemW,itemH,true)
end
end

functionUIListView:scrollListener(event)
if"clicked"==event.namethen
localnodePoint=self.container:convertToNodeSpace(cc.p(event.x,event.y))
localpos
localidx

ifself.bAsyncLoadthen
localitemRect
fori,vinipairs(self.items_)do
localposX,posY=v:getPosition()
localitemW,itemH=v:getItemSize()
itemRect=cc.rect(posX,posY,itemW,itemH)
ifcc.rectContainsPoint(itemRect,nodePoint)then
idx=v.idx_
pos=i
break
end
end
else
nodePoint.x=nodePoint.x-self.viewRect_.x
nodePoint.y=nodePoint.y-self.viewRect_.y

localwidth,height=0,self.size.height
localitemW,itemH=0,0

ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
fori,vinipairs(self.items_)do
itemW,itemH=v:getItemSize()

ifnodePoint.y<heightandnodePoint.y>height-itemHthen
pos=i
idx=pos
nodePoint.y=nodePoint.y-(height-itemH)
break
end
height=height-itemH
end
else
fori,vinipairs(self.items_)do
itemW,itemH=v:getItemSize()

ifnodePoint.x>widthandnodePoint.x<width+itemWthen
pos=i
idx=pos
break
end
width=width+itemW
end
end
end

self:notifyListener_{name="clicked",
listView=self,itemPos=idx,item=self.items_[pos],
point=nodePoint}
else
event.scrollView=nil
event.listView=self
self:notifyListener_(event)
end

end

--start--

--------------------------------
--在列表项中添加一项
--@function[parent=#UIListView]addItem
--@paramnodelistItem要添加的项
--@paramintegerpos要添加的位置,默认添加到最后
--@returnUIListView#UIListView

--end--

functionUIListView:addItem(listItem,pos)
self:modifyItemSizeIf_(listItem)

ifposthen
table.insert(self.items_,pos,listItem)
else
table.insert(self.items_,listItem)
end
self.container:addChild(listItem)

returnself
end

--start--

--------------------------------
--在列表项中移除一项
--@function[parent=#UIListView]removeItem
--@paramnodelistItem要移除的项
--@parambooleanbAni是否要显示移除动画
--@returnUIListView#UIListView

--end--

functionUIListView:removeItem(listItem,bAni)
assert(notself.bAsyncLoad,"UIListView:removeItem()-syncloadnotsupportremove")

localitemW,itemH=listItem:getItemSize()
self.container:removeChild(listItem)

localpos=self:getItemPos(listItem)
ifposthen
table.remove(self.items_,pos)
end

ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
itemW=0
else
itemH=0
end

self.size.width=self.size.width-itemW
self.size.height=self.size.height-itemH

if0==table.nums(self.items_)then
return
end
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
self:moveItems(1,pos-1,-itemW,-itemH,bAni)
else
self:moveItems(pos,table.nums(self.items_),-itemW,-itemH,bAni)
end

returnself
end

--start--

--------------------------------
--移除所有的项
--@function[parent=#UIListView]removeAllItems
--@returninteger#integer

--end--

functionUIListView:removeAllItems()
self.container:removeAllChildren()
self.items_={}

returnself
end

--start--

--------------------------------
--取某项在列表控件中的位置
--@function[parent=#UIListView]getItemPos
--@paramnodelistItem列表项
--@returninteger#integer

--end--

functionUIListView:getItemPos(listItem)
fori,vinipairs(self.items_)do
ifv==listItemthen
returni
end
end
end

--start--

--------------------------------
--判断某项是否在列表控件的显示区域中
--@function[parent=#UIListView]isItemInViewRect
--@paramintegerpos列表项位置
--@returnboolean#boolean

--end--

functionUIListView:isItemInViewRect(pos)
localitem
if"number"==type(pos)then
item=self.items_[pos]
elseif"userdata"==type(pos)then
item=pos
end

ifnotitemthen
return
end

localbound=item:getBoundingBox()
localnodePoint=self.container:convertToWorldSpace(
cc.p(bound.x,bound.y))
bound.x=nodePoint.x
bound.y=nodePoint.y

returncc.rectIntersectsRect(self.viewRect_,bound)
end

--start--

--------------------------------
--加载列表
--@function[parent=#UIListView]reload
--@returnUIListView#UIListView

--end--

functionUIListView:reload()
ifself.bAsyncLoadthen
self:asyncLoad_()
else
self:layout_()
end

returnself
end

--start--

--------------------------------
--取一个空闲项出来,如果没有返回空
--@function[parent=#UIListView]dequeueItem
--@returnUIListViewItem#UIListViewItemitem
--@seeUIListViewItem

--end--

functionUIListView:dequeueItem()
if#self.itemsFree_<1then
return
end

localitem
item=table.remove(self.itemsFree_,1)

--标识从free中取出,在loadOneItem_中调用release
--这里直接调用release,item会被释放掉
item.bFromFreeQueue_=true

returnitem
end

functionUIListView:layout_()
localwidth,height=0,0
localitemW,itemH=0,0
localmargin

--calcatewholewidthheight
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
width=self.viewRect_.width

fori,vinipairs(self.items_)do
itemW,itemH=v:getItemSize()
itemW=itemWor0
itemH=itemHor0

height=height+itemH
end
else
height=self.viewRect_.height

fori,vinipairs(self.items_)do
itemW,itemH=v:getItemSize()
itemW=itemWor0
itemH=itemHor0

width=width+itemW
end
end
self:setActualRect({x=self.viewRect_.x,
y=self.viewRect_.y,
width=width,
height=height})
self.size.width=width
self.size.height=height

localtempWidth,tempHeight=width,height
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
itemW,itemH=0,0

localcontent
fori,vinipairs(self.items_)do
itemW,itemH=v:getItemSize()
itemW=itemWor0
itemH=itemHor0

tempHeight=tempHeight-itemH
content=v:getContent()
content:setAnchorPoint(0.5,0.5)
--content:setPosition(itemW/2,itemH/2)
self:setPositionByAlignment_(content,itemW,itemH,v:getMargin())
v:setPosition(self.viewRect_.x,
self.viewRect_.y+tempHeight)
end
else
itemW,itemH=0,0
tempWidth=0

fori,vinipairs(self.items_)do
itemW,itemH=v:getItemSize()
itemW=itemWor0
itemH=itemHor0

content=v:getContent()
content:setAnchorPoint(0.5,0.5)
--content:setPosition(itemW/2,itemH/2)
self:setPositionByAlignment_(content,itemW,itemH,v:getMargin())
v:setPosition(self.viewRect_.x+tempWidth,self.viewRect_.y)
tempWidth=tempWidth+itemW
end
end

self.container:setPosition(0,self.viewRect_.height-self.size.height)
end

functionUIListView:notifyItem(point)
localcount=self.listener[UIListView.DELEGATE](self,UIListView.COUNT_TAG)
localtemp=(self.direction==UIListView.DIRECTION_VERTICALandself.container:getContentSize().height)or0
localw,h=0,0
localtag=0

fori=1,countdo
w,h=self.listener[UIListView.DELEGATE](self,UIListView.CELL_SIZE_TAG,i)
ifself.direction==UIListView.DIRECTION_VERTICALthen
temp=temp-h
ifpoint.y>tempthen
point.y=point.y-temp
tag=i
break
end
else
temp=temp+w
ifpoint.x<tempthen
point.x=point.x+w-temp
tag=i
break
end
end
end

if0==tagthen
printInfo("UIListView-didn'tfounditem")
return
end

localitem=self.container:getChildByTag(tag)
self.listener[UIListView.DELEGATE](self,UIListView.CLICKED_TAG,tag,point)
end

functionUIListView:moveItems(beginIdx,endIdx,x,y,bAni)
if0==endIdxthen
self:elasticScroll()
end

localposX,posY=0,0

localmoveByParams={x=x,y=y,time=0.2}
fori=beginIdx,endIdxdo
ifbAnithen
ifi==beginIdxthen
moveByParams.onComplete=function()
self:elasticScroll()
end
else
moveByParams.onComplete=nil
end
transition.moveBy(self.items_[i],moveByParams)
else
posX,posY=self.items_[i]:getPosition()
self.items_[i]:setPosition(posX+x,posY+y)
ifi==beginIdxthen
self:elasticScroll()
end
end
end
end

functionUIListView:notifyListener_(event)
ifnotself.touchListener_then
return
end

self.touchListener_(event)
end

functionUIListView:modifyItemSizeIf_(item)
localw,h=item:getItemSize()

ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
ifw~=self.viewRect_.widththen
item:setItemSize(self.viewRect_.width,h,true)
end
else
ifh~=self.viewRect_.heightthen
item:setItemSize(w,self.viewRect_.height,true)
end
end
end

functionUIListView:update_(dt)
UIListView.super.update_(self,dt)

self:checkItemsInStatus_()
ifself.bAsyncLoadthen
self:increaseOrReduceItem_()
end
end

functionUIListView:checkItemsInStatus_()
ifnotself.itemInStatus_then
self.itemInStatus_={}
end

localrectIntersectsRect=function(rectParent,rect)
--dump(rectParent,"parent:")
--dump(rect,"rect:")

localnIntersects--0:nointersects,1:haveintersects,2,haveintersectsandincludetotally
localbIn=rectParent.x<=rect.xand
rectParent.x+rectParent.width>=rect.x+rect.widthand
rectParent.y<=rect.yand
rectParent.y+rectParent.height>=rect.y+rect.height
ifbInthen
nIntersects=2
else
localbNotIn=rectParent.x>rect.x+rect.widthor
rectParent.x+rectParent.width<rect.xor
rectParent.y>rect.y+rect.heightor
rectParent.y+rectParent.height<rect.y
ifbNotInthen
nIntersects=0
else
nIntersects=1
end
end

returnnIntersects
end

localnewStatus={}
localbound
localnodePoint
fori,vinipairs(self.items_)do
bound=v:getBoundingBox()
nodePoint=self.container:convertToWorldSpace(cc.p(bound.x,bound.y))
bound.x=nodePoint.x
bound.y=nodePoint.y
newStatus[i]=
rectIntersectsRect(self.viewRect_,bound)
end

--dump(self.itemInStatus_,"status:")
--dump(newStatus,"newStatus:")
fori,vinipairs(newStatus)do
ifself.itemInStatus_[i]andself.itemInStatus_[i]~=vthen
--print("statsus:"..self.itemInStatus_[i].."v:"..v)
localparams={listView=self,
itemPos=i,
item=self.items_[i]}
if0==vthen
params.name="itemDisappear"
elseif1==vthen
params.name="itemAppearChange"
elseif2==vthen
params.name="itemAppear"
end
self:notifyListener_(params)
else
--print("statussame:"..self.itemInStatus_[i])
end
end
self.itemInStatus_=newStatus
--dump(self.itemInStatus_,"status:")
--print("itemStaus:"..#self.itemInStatus_)
end

--[[--

动态调整item,是否需要加载新item,移除旧item
私有函数

]]
functionUIListView:increaseOrReduceItem_()

if0==#self.items_then
print("ERRORitemscountis0")
return
end

localgetContainerCascadeBoundingBox=function()
localboundingBox
fori,iteminipairs(self.items_)do
localw,h=item:getItemSize()
localx,y=item:getPosition()
localanchor=item:getAnchorPoint()
x=x-anchor.x*w
y=y-anchor.y*h

ifboundingBoxthen
boundingBox=cc.rectUnion(boundingBox,cc.rect(x,y,w,h))
else
boundingBox=cc.rect(x,y,w,h)
end
end

localpoint=self.container:convertToWorldSpace(cc.p(boundingBox.x,boundingBox.y))
boundingBox.x=point.x
boundingBox.y=point.y
returnboundingBox
end

localcount=self.delegate_[UIListView.DELEGATE](self,UIListView.COUNT_TAG)
localnNeedAdjust=2--作为是否还需要再增加或减少item的标志,2表示上下两个方向或左右都需要调整
localcascadeBound=getContainerCascadeBoundingBox()
localitem
localitemW,itemH

--print("childcount:"..self.container:getChildrenCount())
--dump(cascadeBound,"increaseOrReduceItem_cascadeBound:")
--dump(self.viewRect_,"increaseOrReduceItem_viewRect:")

ifUIScrollView.DIRECTION_VERTICAL==self.directionthen

--aheadpartofview
localdisH=cascadeBound.y+cascadeBound.height-self.viewRect_.y-self.viewRect_.height
localtempIdx
item=self.items_[1]
ifnotitemthen
print("increaseOrReduceItem_itemisnil,allitemcount:"..#self.items_)
return
end
tempIdx=item.idx_
--print(string.format("befordisH:%d,viewval:%d",disH,self.redundancyViewVal))
ifdisH>self.redundancyViewValthen
itemW,itemH=item:getItemSize()
ifcascadeBound.height-itemH>self.viewRect_.height
anddisH-itemH>self.redundancyViewValthen
self:unloadOneItem_(tempIdx)
else
nNeedAdjust=nNeedAdjust-1
end
else
item=nil
tempIdx=tempIdx-1
iftempIdx>0then
locallocalPoint=self.container:convertToNodeSpace(cc.p(cascadeBound.x,cascadeBound.y+cascadeBound.height))
item=self:loadOneItem_(localPoint,tempIdx,true)
end
ifnil==itemthen
nNeedAdjust=nNeedAdjust-1
end
end

--partafterview
disH=self.viewRect_.y-cascadeBound.y
item=self.items_[#self.items_]
ifnotitemthen
return
end
tempIdx=item.idx_
--print(string.format("afterdisH:%d,viewval:%d",disH,self.redundancyViewVal))
ifdisH>self.redundancyViewValthen
itemW,itemH=item:getItemSize()
ifcascadeBound.height-itemH>self.viewRect_.height
anddisH-itemH>self.redundancyViewValthen
self:unloadOneItem_(tempIdx)
else
nNeedAdjust=nNeedAdjust-1
end
else
item=nil
tempIdx=tempIdx+1
iftempIdx<=countthen
locallocalPoint=self.container:convertToNodeSpace(cc.p(cascadeBound.x,cascadeBound.y))
item=self:loadOneItem_(localPoint,tempIdx)
end
ifnil==itemthen
nNeedAdjust=nNeedAdjust-1
end
end
else
--leftpartofview
localdisW=self.viewRect_.x-cascadeBound.x
item=self.items_[1]
localtempIdx=item.idx_
ifdisW>self.redundancyViewValthen
itemW,itemH=item:getItemSize()
ifcascadeBound.width-itemW>self.viewRect_.width
anddisW-itemW>self.redundancyViewValthen
self:unloadOneItem_(tempIdx)
else
nNeedAdjust=nNeedAdjust-1
end
else
item=nil
tempIdx=tempIdx-1
iftempIdx>0then
locallocalPoint=self.container:convertToNodeSpace(cc.p(cascadeBound.x,cascadeBound.y))
item=self:loadOneItem_(localPoint,tempIdx,true)
end
ifnil==itemthen
nNeedAdjust=nNeedAdjust-1
end
end

--rightpartofview
disW=cascadeBound.x+cascadeBound.width-self.viewRect_.x-self.viewRect_.width
item=self.items_[#self.items_]
tempIdx=item.idx_
ifdisW>self.redundancyViewValthen
itemW,itemH=item:getItemSize()
ifcascadeBound.width-itemW>self.viewRect_.width
anddisW-itemW>self.redundancyViewValthen
self:unloadOneItem_(tempIdx)
else
nNeedAdjust=nNeedAdjust-1
end
else
item=nil
tempIdx=tempIdx+1
iftempIdx<=countthen
locallocalPoint=self.container:convertToNodeSpace(cc.p(cascadeBound.x+cascadeBound.width,cascadeBound.y))
item=self:loadOneItem_(localPoint,tempIdx)
end
ifnil==itemthen
nNeedAdjust=nNeedAdjust-1
end
end
end

--print("increaseOrReduceItem_()adjust:"..nNeedAdjust)
--print("increaseOrReduceItem_()itemcount:"..#self.items_)
ifnNeedAdjust>0then
returnself:increaseOrReduceItem_()
end
end

--[[--

异步加载列表数据

@returnUIListView

]]
functionUIListView:asyncLoad_()
self:removeAllItems()
self.container:setPosition(0,0)
self.container:setContentSize(cc.size(0,0))

localcount=self.delegate_[UIListView.DELEGATE](self,UIListView.COUNT_TAG)

self.items_={}
localitemW,itemH=0,0
localitem
localcontainerW,containerH=0,0
localposX,posY=0,0
fori=1,countdo
item,itemW,itemH=self:loadOneItem_(cc.p(posX,posY),i)

ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
posY=posY-itemH

containerH=containerH+itemH
else
posX=posX+itemW

containerW=containerW+itemW
end

--初始布局,最多保证可隐藏的区域大于显示区域就可以了
ifcontainerW>self.viewRect_.width+self.redundancyViewVal
orcontainerH>self.viewRect_.height+self.redundancyViewValthen
break
end
end

--self.container:setPosition(self.viewRect_.x,self.viewRect_.y)
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
self.container:setPosition(self.viewRect_.x,
self.viewRect_.y+self.viewRect_.height)
else
self.container:setPosition(self.viewRect_.x,self.viewRect_.y)
end

returnself
end

--start--

--------------------------------
--设置delegate函数
--@function[parent=#UIListView]setDelegate
--@returnUIListView#UIListView

--end--

functionUIListView:setDelegate(delegate)
self.delegate_[UIListView.DELEGATE]=delegate
end

--[[--

调整item中content的布局,
私有函数

]]
functionUIListView:setPositionByAlignment_(content,w,h,margin)
localsize=content:getContentSize()
if0==margin.leftand0==margin.rightand0==margin.topand0==margin.bottomthen
ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
ifUIListView.ALIGNMENT_LEFT==self.alignmentthen
content:setPosition(size.width/2,h/2)
elseifUIListView.ALIGNMENT_RIGHT==self.alignmentthen
content:setPosition(w-size.width/2,h/2)
else
content:setPosition(w/2,h/2)
end
else
ifUIListView.ALIGNMENT_TOP==self.alignmentthen
content:setPosition(w/2,h-size.height/2)
elseifUIListView.ALIGNMENT_RIGHT==self.alignmentthen
content:setPosition(w/2,size.height/2)
else
content:setPosition(w/2,h/2)
end
end
else
localposX,posY
if0~=margin.rightthen
posX=w-margin.right-size.width/2
else
posX=size.width/2+margin.left
end
if0~=margin.topthen
posY=h-margin.top-size.height/2
else
posY=size.height/2+margin.bottom
end
content:setPosition(posX,posY)
end
end

--[[--

加载一个数据项
私有函数

@paramtableoriginPoint数据项要加载的起始位置
@paramnumberidx要加载数据的序号
@parambooleanbBefore是否加在已有项的前面

@returnUIListViewItemitem

]]
functionUIListView:loadOneItem_(originPoint,idx,bBefore)
--print("UIListViewloadOneItemidx:"..idx)
--dump(originPoint,"originPoint:")

localitemW,itemH=0,0
localitem
localcontainerW,containerH=0,0
localposX,posY=originPoint.x,originPoint.y
localcontent

item=self.delegate_[UIListView.DELEGATE](self,UIListView.CELL_TAG,idx)
ifnil==itemthen
print("ERROR!UIListViewloadnilitem")
return
end
item.idx_=idx
itemW,itemH=item:getItemSize()

ifUIScrollView.DIRECTION_VERTICAL==self.directionthen
itemW=itemWor0
itemH=itemHor0

ifbBeforethen
posY=posY
else
posY=posY-itemH
end
content=item:getContent()
content:setAnchorPoint(0.5,0.5)
self:setPositionByAlignment_(content,itemW,itemH,item:getMargin())
item:setPosition(0,posY)

containerH=containerH+itemH
else
itemW=itemWor0
itemH=itemHor0
ifbBeforethen
posX=posX-itemW
end

content=item:getContent()
content:setAnchorPoint(0.5,0.5)
self:setPositionByAlignment_(content,itemW,itemH,item:getMargin())
item:setPosition(posX,0)

containerW=containerW+itemW
end

ifbBeforethen
table.insert(self.items_,1,item)
else
table.insert(self.items_,item)
end

self.container:addChild(item)
ifitem.bFromFreeQueue_then
item.bFromFreeQueue_=nil
item:release()
end
--localcascadeBound=self.container:getCascadeBoundingBox()
--dump(cascadeBound,"cascadeBound:")

returnitem,itemW,itemH
end

--[[--

移除一个数据项
私有函数

]]
functionUIListView:unloadOneItem_(idx)
--print("UIListViewunloadOneItemidx:"..idx)

localitem=self.items_[1]

ifnil==itemthen
return
end
ifitem.idx_>idxthen
return
end
localunloadIdx=idx-item.idx_+1
item=self.items_[unloadIdx]
ifnil==itemthen
return
end
table.remove(self.items_,unloadIdx)
self:addFreeItem_(item)
--item:removeFromParent(false)
self.container:removeChild(item,false)

self.delegate_[UIListView.DELEGATE](self,UIListView.UNLOAD_CELL_TAG,idx)
end

--[[--

加一个空项到空闲列表中
私有函数

]]
functionUIListView:addFreeItem_(item)
item:retain()
table.insert(self.itemsFree_,item)
end

--[[--

释放所有的空闲列表项
私有函数

]]
functionUIListView:releaseAllFreeItems_()
fori,vinipairs(self.itemsFree_)do
v:release()
end
self.itemsFree_={}
end

returnUIListView
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: