近段时间,由于项目需要做一个任务列表,于是就想到了CCScrollView和CCTableView,因为之前没怎么接触过CCTableView,于是就想顺便学习一下,最主要的是这里用到CCTableView比用CCScrollView更合适,还是先贴上我的代码,再发感慨吧!
CCTableViewCell* CCPlayAndFriendLayer::tableCellAtIndex(cocos2d::extension::CCTableView *table, unsigned int idx)
{
//CCTableViewCell *cell = table->dequeueCell();
CCTableViewCell *cell = table->cellAtIndex(idx);
char buf[32];
if (idx > m_num) {
return NULL;
}
if (!cell) {
cell = new CCTableViewCell();
cell->autorelease();
CCSprite* bg = CCSprite::createWithSpriteFrameName("bg.png");
bg->setPosition(CCPointZero);
bg->setAnchorPoint(CCPointZero);
cell->addChild(bg);
sprintf(buf, "%d.png", idx + 1);
CCSprite *img = CCSprite::createWithSpriteFrameName(buf);
img->setPosition(CCPointZero);
img->setAnchorPoint(CCPointZero);
img->setTag(123);
cell->addChild(img);
CCSprite* normal = CCSprite::createWithSpriteFrameName("Btn.png");
CCSprite* select = CCSprite::createWithSpriteFrameName("Btn.png");
select->setColor(ccc3_selectColor);
CCMenuItemSprite* invitationItem = CCMenuItemSprite::create(normal, select, this, menu_selector(CCPlayAndFriendLayer::menuCallBack));
CCMenu* pMenu = CCMenu::create(invitationItem, NULL);
cell->addChild(pMenu);
pMenu->setPosition(bg->getContentSize().width - normal->getContentSize().width - 10, normal->getContentSize().height);
CCLabelTTF* word = CCLabelTTF::create(buf, "Arial", 24);
invitationItem->addChild(word);
word->setPosition(ccp(normal->getContentSize().width / 2, normal->getContentSize().height / 2));
}
else
{ sprintf(buf, "midlevel_%d.png", idx + 1);
CCTexture2D* pTexture = CCTextureCache::sharedTextureCache()->addImage(buf);
CCSprite *img = (CCSprite*)getChildByTag(123);
if (img) {
img->setTexture(pTexture);
}
}
return cell;
}
//片段1
sprintf(buf, "%d.png", idx + 1);
CCTexture2D* pTexture = CCTextureCache::sharedTextureCache()->addImage(buf);
CCSprite *img = (CCSprite*)getChildByTag(idx + 1);
img->setTexture(pTexture);
img->setPosition(CCPointZero);
img->setScale(0.85f);
img->setAnchorPoint(CCPointZero);
img->setTag(123);
cell->addChild(img);
下面就来说说遇到的问题,起初我也不太会用这个控件,后来根据网上的资料写了一个例子,但是用的时候发现有cell的顺序错乱和重复出现的问题。然后就不停的找原因,终于发现原来是我用错了,
如果列表子项是可变的,那就用下面的方法,table->cellAtIndex(idx)
<pre name="code" class="cpp">否则,就推荐用这个方法,产生不变大小的子项 table->dequeueCell()
也有人如片段1中所示这么用,让程序每次都重新创建cell,不过这样效率不高,不建议这么做