之前写的ExpandedListView版本由于版本升级这里提供Cocos2d-x 3.3Bate0 版本
代码下载:http://download.csdn.net/detail/qqmcy/8033343
下面介绍下如何使用。
先介绍下
DJDataObject存放数据模型的类
DayReportListAdapter 自定义的adapter或是iOS中的cell
ListViewTest 示例类。
下面上代码啦
DJDataObject.h
// // DJDataObject.h // testthirdone // // Created by 杜甲 on 14-6-7. // // #ifndef __testthirdone__DJDataObject__ #define __testthirdone__DJDataObject__ #include "cocos2d.h" USING_NS_CC; class DJDataObject :public Ref { public: CREATE_FUNC(DJDataObject); virtual bool init(); std::string name; std::vector<DJDataObject*> children; void initWithNameAndChildren(std::string name,std::vector<DJDataObject*> data_vec); }; #endif /* defined(__testthirdone__DJDataObject__) */
DJDataObject.cpp
// // DJDataObject.cpp // testthirdone // // Created by 杜甲 on 14-6-7. // // #include "DJDataObject.h" bool DJDataObject::init() { bool bRet = false; do { bRet = true; } while (0); return bRet; } void DJDataObject::initWithNameAndChildren(std::string name,std::vector<DJDataObject*> data_vec) { this->name = name; this->children = data_vec; }
DayReportListAdapter.h
// // DayReportListAdapter.h // // // Created by 杜甲 on 14-6-4. // // #ifndef __ht_mobile_cpp__DayReportListAdapter__ #define __ht_mobile_cpp__DayReportListAdapter__ #include "cocos2d.h" #include "ui/CocosGUI.h" #include "DJTreeNodeInfo.h" USING_NS_CC; class DayReportListAdapter :public ui::Layout { public: CREATE_FUNC(DayReportListAdapter); virtual bool init(); ui::Text* organName; ui::Text* prem_day; ui::Text* prem_month; ui::ImageView* in_Image; void setBackGround(int treeDepthLevel); Vec2 preVec2; float preOffsetX; typedef std::function<void(Ref*,Vec2 offset_vec2)> ccAdapterCallback; void addEventListener(const ccAdapterCallback& callback); ccAdapterCallback _eventCallback; bool isMoving_HORIZONTAL; Size winSize; }; #endif /* defined(__ht_mobile_cpp__DayReportListAdapter__) */
DayReportListAdapter.cpp
// // DayReportListAdapter.cpp // // // Created by 杜甲 on 14-6-4. // // #include "DayReportListAdapter.h" #include "VisibleRect.h" bool DayReportListAdapter::init() { bool bRet = false; do { CC_BREAK_IF(!ui::Layout::init()); setLayoutType(cocos2d::ui::Layout::Type::RELATIVE); setBackGroundColorType(ui::Layout::BackGroundColorType::SOLID); winSize = Director::getInstance()->getWinSize(); setTouchEnabled(true); float topLength = 30; in_Image = ui::ImageView::create("CloseNormal.png"); in_Image->setScale(VisibleRect::getImageScale()); in_Image->setTouchEnabled(true); addChild(in_Image); auto rp_image = ui::RelativeLayoutParameter::create(); rp_image->setRelativeName("rp_image"); float offset = -in_Image->getContentSize().width * 2/3 *(1- VisibleRect::getImageScale()); rp_image->setMargin(ui::Margin(-in_Image->getContentSize().width * 2/3 *(1- VisibleRect::getImageScale()),0)); rp_image->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL); in_Image->setLayoutParameter(rp_image); organName = ui::Text::create(); organName->setFontSize(38 * VisibleRect::getImageScale()); organName->setColor(Color3B::BLACK); addChild(organName); auto rp_organName = ui::RelativeLayoutParameter::create(); rp_organName->setRelativeName("rp_organName"); rp_organName->setRelativeToWidgetName("rp_image"); rp_organName->setMargin(ui::Margin(1 * VisibleRect::getImageScale() + offset,topLength,0)); rp_organName->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_CENTER); organName->setLayoutParameter(rp_organName); prem_month = ui::Text::create(); prem_month->setFontSize(38 * VisibleRect::getImageScale()); prem_month->setTextHorizontalAlignment(cocos2d::TextHAlignment::LEFT); prem_month->setColor(Color3B::BLACK); addChild(prem_month); auto rp_prem_month = ui::RelativeLayoutParameter::create(); rp_prem_month->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_RIGHT); rp_prem_month->setRelativeName("rp_prem_month"); rp_prem_month->setMargin(ui::Margin(0,50*VisibleRect::getImageScale(),0)); prem_month->setLayoutParameter(rp_prem_month); auto center = ui::Layout::create(); center->setSize(Size(1,1)); addChild(center); auto rp_center = ui::RelativeLayoutParameter::create(); rp_center->setRelativeName("rp_center"); rp_center->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT); center->setLayoutParameter(rp_center); prem_day = ui::Text::create(); prem_day->setTextHorizontalAlignment(cocos2d::TextHAlignment::LEFT); prem_day->setFontSize(38 * VisibleRect::getImageScale()); prem_day->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT); prem_day->setSize(Size(100,50)); prem_day->setColor(Color3B::BLACK); addChild(prem_day); auto rp_prem_day = ui::RelativeLayoutParameter::create(); rp_prem_day->setRelativeToWidgetName("rp_center"); rp_prem_day->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_CENTER_HORIZONTAL); // rp_prem_day->setRelativeToWidgetName("rp_prem_month"); rp_prem_day->setMargin(ui::Margin(30,0)); prem_day->setLayoutParameter(rp_prem_day); auto bottom_color = ui::Layout::create(); bottom_color->setSize(Size(winSize.width,1)); bottom_color->setBackGroundColorType(ui::Layout::BackGroundColorType::SOLID); bottom_color->setBackGroundColor(Color3B::BLACK); addChild(bottom_color); auto rp_bottom_color = ui::RelativeLayoutParameter::create(); rp_bottom_color->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_BOTTOM_CENTER_HORIZONTAL); rp_bottom_color->setMargin(ui::Margin(0,1)); bottom_color->setLayoutParameter(rp_bottom_color); bRet = true; } while (0); return bRet; } void DayReportListAdapter::setBackGround(int treeDepthLevel) { log("treeDepthLevel = %d",treeDepthLevel); switch (treeDepthLevel) { case 0: setBackGroundColor(Color3B(209,238,252)); break; case 1: setBackGroundColor(Color3B(224,248,216)); break; case 2: break; default: break; } } void DayReportListAdapter::addEventListener(const ccAdapterCallback &callback) { _eventCallback = callback; }
ListViewTest.h
// // ListViewTest.h // testthirdone // // Created by 杜甲 on 14-6-9. // // /* * 示例Demo */ #ifndef __testthirdone__ListViewTest__ #define __testthirdone__ListViewTest__ #include "cocos2d.h" #include "ui/CocosGUI.h" #include "DJDataObject.h" #include "DJListView.h" USING_NS_CC; using namespace ui; class ListViewTest : public ui::Layout,public DJListViewDataSource,public DJListViewDelegate { public: CREATE_FUNC(ListViewTest); virtual bool init(); private: std::vector<DJDataObject*> data_vec; virtual ssize_t treeViewNumberOfChildrenOfItem(DJListView *treeView,void *item) ; virtual ui::Layout *treeViewAndCellForItemAndTreeNodeInfo(DJListView *treeView,void *item,DJTreeNodeInfo *treeNodeInfo); virtual void* treeViewAndChildOfItem(DJListView *treeView,int index,void *item); Size winSize; virtual void treeViewWillDisplayCellForItemTreeNodeInfo(DJListView *treeView,ui::Layout *adapter,DJTreeNodeInfo *treeNodeInfo) ; }; #endif /* defined(__testthirdone__ListViewTest__) */
ListViewTest.cpp
// // ListViewTest.cpp // testthirdone // // Created by 杜甲 on 14-6-9. // // #include "ListViewTest.h" #include "DJTreeNode.h" #include "DJTreeNodeInfo.h" #include "DayReportListAdapter.h" bool ListViewTest::init() { bool bRet = false; do { CC_BREAK_IF(!ui::Layout::init()); winSize = Director::getInstance()->getWinSize(); setBackGroundColorType(ui::Layout::BackGroundColorType::SOLID); setBackGroundColor(Color3B(18,23,222)); std::vector<DJDataObject*>temp1; std::vector<DJDataObject*>temp2; std::vector<DJDataObject*>temp3; std::vector<DJDataObject*>temp4; DJDataObject* data7 = DJDataObject::create(); data7->retain(); //initWithNameAndChildren 参数1:当前数据内容, 参数2 :子集 data7->initWithNameAndChildren("数据1-1-1",temp4); temp1.push_back(data7); DJDataObject* data3 = DJDataObject::create(); data3->retain(); data3->initWithNameAndChildren("数据1-1",temp1); DJDataObject* data4 = DJDataObject::create(); data4->retain(); data4->initWithNameAndChildren("数据1-2",temp4); for (int i = 0; i < 7; i++) { DJDataObject* data6 = DJDataObject::create(); data6->retain(); data6->initWithNameAndChildren("数据h",temp3); temp2.push_back(data6); } DJDataObject* data1 = DJDataObject::create(); data1->retain(); data1->initWithNameAndChildren("数据r",temp2); DJDataObject* data = DJDataObject::create(); data->retain(); std::vector<DJDataObject*>temp; temp.push_back(data3); temp.push_back(data4); data->initWithNameAndChildren("数据12",temp); data_vec.push_back(data); data_vec.push_back(data1); auto winSize = Director::getInstance()->getWinSize(); auto listView1 = DJListView::create(); listView1->setDJListViewDataSource(this); listView1->setDJListViewDelegate(this); listView1->setSize(winSize); listView1->addExpandedListView(data_vec); addChild(listView1); bRet = true; } while (0); return bRet; } void ListViewTest::treeViewWillDisplayCellForItemTreeNodeInfo(DJListView *treeView,DJTreeNodeInfo *treeNodeInfo) { if (treeNodeInfo->treeDepthLevel == 0) { adapter->setBackGroundColor(Color3B(150,100,200)); }else if (treeNodeInfo->treeDepthLevel == 1) { adapter->setBackGroundColor(Color3B(100,100)); }else if (treeNodeInfo->treeDepthLevel == 2) { adapter->setBackGroundColor(Color3B(100,150,150)); } } ssize_t ListViewTest::treeViewNumberOfChildrenOfItem(DJListView *treeView,void *item) { if (item == nullptr) { return data_vec.size(); } DJDataObject* data = static_cast<DJDataObject*>(item); return data->children.size(); } ui::Layout* ListViewTest::treeViewAndCellForItemAndTreeNodeInfo(DJListView *treeView,DJTreeNodeInfo *treeNodeInfo) { DJDataObject* dobject = static_cast<DJDataObject*>(item) ; auto tableLayout1 = DayReportListAdapter::create(); tableLayout1->setSize(Size(winSize.width,100)); tableLayout1->setBackGroundColorType(ui::Layout::BackGroundColorType::SOLID); // tableLayout1->setBackGround(treeNodeInfo->treeDepthLevel); // tableLayout1->setBackGroundColor(Color3B(189,203,222)); // listView->pushBackCustomItem(tableLayout1); tableLayout1->organName->setString(dobject->name); tableLayout1->prem_day->setString(StringUtils::format("%d",333)); tableLayout1->prem_month->setString("fffff"); return tableLayout1; } void* ListViewTest::treeViewAndChildOfItem(DJListView *treeView,void *item) { DJDataObject* data = static_cast<DJDataObject*>(item); if (item == nullptr) { return data_vec.at( index ); } return data->children.at( index ); }
效果: