http://www.cnblogs.com/dudu580231/p/4924192.html原文
cocos2dx ListView 动态加载(代码)
其实是根据上篇文章得出的:
在ListView中加载少量的内容,
然后在滑出界面的时候在加载一部分剩余的内容,
这样实现动态加载!!!
为了看出效果来,需要建立一个场景,然后点击按钮之后实现跳转,进而可以看出等待时间
代码:
1 MainScene.h 2 3 #ifndef __MAINSCENE_SCENE_H__ 4 #define __MAINSCENE_SCENE_H__ 5 6 #include "cocos2d.h" 7 8 // 使用 cocosStudio 1.6 制作的头文件 9 #include cocos-ext.h10 USING_NS_CC; 11 USING_NS_CC_EXT; 12 using namespace cocos2d::ui; 13 14 USING_NS_CC; 15 16 class MainScene : public cocos2d::CCLayer 17 { 18 public: 19 Here's a difference. Method 'init' in cocos2d-x returns bool,instead of returning 'id' in cocos2d-iphone 20 virtual bool init(); 21 22 there's no 'id' in cpp,so we recommend returning the class instance pointer 23 static cocos2d::CCScene* scene(); 24 25 a selector callback 26 void menuCloseCallback(cocos2d::CCObject*pSender,cocos2d::ui::TouchEventType type); 27 28 implement the "static node()" method manually 29 CREATE_FUNC(MainScene); 30 }; 31 32 #endif __MAINSCENE_SCENE_H__
MainScene.cpp #include MainScene.h" #include HelloWorldScene.h" MainScene::scene(){ 'scene' is an autorelease object CCScene *scene = CCScene::create(); 'layer' is an autorelease object MainScene *layer = MainScene::create(); add layer as a child to scene scene->addChild(layer); return the scene return scene; } bool MainScene::init(){ if ( !CCLayer::init() ) { return false; } 以下使用的必须是json文件 cocos2d::ui::Widget *m_pWidget = GUIReader::shareReader()->widgetFromJsonFile(ListViewItem_1/ListViewItem_1.json"); 创建一个可以装Widge的一个层 cocos2d::ui::UILayer *m_pUIlayer = cocos2d::ui::UILayer::create(); 使用 addWidget 方法加载 cocosStudio制作的json文件 m_pUIlayer->addWidget(m_pWidget); 将 UILayer 添加到场景中 this->addChild(m_pUIlayer); 获取按钮 cocos2d::ui::UIButton *button = dynamic_cast<cocos2d::ui::UIButton*>(m_pUIlayer->getWidgetByName(dybtn_buttonitem")); button->setTouchEnabled(true); button->addTouchEventListener(this,SEL_TouchEvent(&MainScene::menuCloseCallback)); true; } void MainScene::menuCloseCallback(cocos2d::CCObject*pSender,cocos2d::ui::TouchEventType type){ switch (type) { case cocos2d::ui::TouchEventType::TOUCH_EVENT_BEGAN: { CCLOG(-- silent -- began -- menuCallBack ---- "); } break; case cocos2d::ui::TouchEventType::TOUCH_EVENT_MOVED: { } case cocos2d::ui::TouchEventType::TOUCH_EVENT_ENDED: { CCScene *pScene = HelloWorld::scene(); CCDirector::sharedDirector()->replaceScene(pScene); } case cocos2d::ui::TouchEventType::TOUCH_EVENT_CANCELED: { } break; default: break; } }
HelloWorldScene.h 测试ListView的动态加载的场景 #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include ListViewItem.h 使用 cocosStudio 1.6 制作的头文件 #include " USING_NS_CC; USING_NS_CC_EXT; namespace cocos2d::ui; class HelloWorld : public cocos2d::CCLayer { public: bool init(); static cocos2d::CCScene* scene(); implement the "static node()" method manually CREATE_FUNC(HelloWorld); 往ListView中添加内容,实现动态加载ListView中的内容 void addObjiceList(); private: cocos2d::ui::UIListView *m_pListView; ListView 对象 }; __HELLOWORLD_SCENE_H__
HelloWorldScene.cpp #include UIMyListView.h" USING_NS_CC_EXT; USING_NS_CC; CCScene* HelloWorld::scene() { 'layer' is an autorelease object HelloWorld *layer = HelloWorld::create(); on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// 1. super init first ListView_1/ListView_1.jsonthis->addChild(m_pUIlayer); 获取文件中的 ListView 列表容器 m_pListView = dynamic_cast<cocos2d::ui::UIListView*>(m_pUIlayer->getWidgetByName(dylv_twolistview")); dybtn_button")); 在动态加载之前,先加载一屏幕的内容 addObjiceList(); addObjiceList(); addObjiceList(); addObjiceList(); 动态加载listView 使用方法 UIMyDynamicListView* m_pDynamicListView; 创建动态类 m_pDynamicListView = UIMyDynamicListView::createExpendDynamicListView(); 将ListView加载到动态类中 m_pDynamicListView->init(m_pListView); 当listView加载到顶部时 动态加载的数量 m_pDynamicListView->setAddCount(1); 设置listview中Item的总数 m_pDynamicListView->setItemNeedDynamicCount(50); 界面类中添加的回调函数 addObjiceList为回调函数 处理listview的信息 就是在外面初始化之后再添加到listView中,这样就可以动态加载了 m_pDynamicListView->setCallBackFunctionAddItem(HelloWorld::addObjiceList)); true; } void HelloWorld::addObjiceList() { for(int i = 0; i < 100; i++) { 创建一个 layout 用来添加另一个 cocosStudio 导出的 json 文件 cocos2d::ui::Layout *pLayout = cocos2d::ui::Layout::create(); 设置 layout 的大小 pLayout->setSize(cocos2d::CCSizeMake(70,70)); for(int i = 0; i < 5; i ++) { 创建另一个 json 文件, 即一个按钮 (使用 cocosStudio 制作) ListViewItem *item = ListViewItem::create(i); 设置按钮的位置 ( 实现三排的效果, 在中间之后一次往后排 ) item->setPosition(ccp((i)*0)); 将三个 按钮 都添加到一个 layout 中,使其实现在同一排的效果 pLayout->addChild(item); } vecLayout.push_back(pLayout); 初始化 100 个 m_pListView->pushBackCustomItem(pLayout); 将 layout 添加到 ListView 中 } }
UIMyListView.h 动态类,主要是这个类的作用 #ifndef _UI_MYLISTVIEW_ #define _UI_MYLISTVIEW_ #include " USING_NS_CC_EXT; typedef void (cocos2d::CCObject::*m_AddItemfunction)(); class UI_MyListView: public cocos2d::ui::UIListView { public: 设置listview的选项 void setCurSelectedIndex(int index); 设置listview的移动点 void setPositionOfContainer(cocos2d::CCPoint pos); 获得listview的移动点 cocos2d::CCPoint getPositionOfContainer(); }; 动态加载listView 使用方法 UIMyDynamicListView* m_pDynamicListView; 创建动态类 m_pDynamicListView = UIMyDynamicListView::createExpendDynamicListView(); 将ListView加载到动态类中 m_pDynamicListView->init(m_pServerList); 当listView加载到顶部时 动态加载的数量 m_pDynamicListView->setAddCount(3); 设置listview中Item的总数 m_pDynamicListView->setItemNeedDynamicCount(m_allServers.size()); 界面类中添加的回调函数 addObjiceList为回调函数 处理listview的信息 m_pDynamicListView->setCallBackFunctionAddItem(this,(m_AddItemfunction)(&ObjiceLayer::addObjiceList)); class UIMyDynamicListView:public cocos2d::CCObject { static UIMyDynamicListView* createExpendDynamicListView(); 创建动态类用来包裹ListView UIMyDynamicListView(); ~UIMyDynamicListView(); void init(cocos2d::ui::UIListView* listView); 将ListView添加到动态类中 void addItemTo(); 加载的item cocos2d::CCObject* m_pListener; void setCallBackFunctionAddItem(cocos2d::CCObject* pListener,void (cocos2d::CCObject::*pfunction)()) { m_pListener = pListener; m_pCallFunc = pfunction; } void setAddCount(unsigned int nCount); 设置动态加载的数量(即每次滑到底部的时候要加载的数量) unsigned int getAddCount(); 获取动态加载的数量 void setItemNeedDynamicCount(unsigned int nCount); 设置未加载的个数 unsigned int getItemNeedDynamicCount(); 获取未加载的个数 private: ListView的滑动事件 void menuEvent(cocos2d::CCObject*pSender,cocos2d::ui::ScrollviewEventType type); m_AddItemfunction m_pCallFunc; // void (cocos2d::CCObject::*m_AddItemfunction)() m_pCallFuncs; bool m_bLockAddItem; 是否加载 unsigned int m_nAddCount; 每次动态添加的个数 unsigned int m_nItemNeedDynamicCount; item的剩余未加载数 cocos2d::ui::UIListView* m_listView; 外界传进来的ListView }; #endif