Cocos2d-x学习(八):cocos2d-x 2.0 中CCListView的用法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

cocos2d-x 2.0 版更新了,把opengl 1.1 替换为opengl 2.0,这个版本只能在iphone 3gs,android 2.2 以上版本才能跑,并且android的模拟器也不支持!

这次更新终于更新了几个UI控件,比如Button,Slider,ListView(本来打算自己写个ListView的,这下省事了,看到注释,这里要感谢网龙公司了,当然,还要感谢cocos2d-x的整合)。

但是这个tests中没有加入对ListView的使用教程,只有在CCTextureWatcher中有简单的提到,但是CCTextureWatcher是缓存图片纹理的查看类,并不是单纯的ListView的教程介绍,考虑到以后肯定会用到,所以先记录一下简单的用法和原理。


1.CCListView的设计,主要分为3部分

(1)ListView容器

ListView容器就是盛放Cell的大容器,CCListView继承于CCLayerColor,主要是处理显示样式,监听触摸事件,更新的操作。

(2)Cell子容器

CCListViewCell也是继承于CCLayerColor,它处理的就很单纯了,就是负责ListView中每一项(Item)的显示

(3)代理方法

CCListViewDelegate定义了关于CCListView的回调接口,这个和ios app开发中TabView的原理是一样的。

(可能从android刚刚转到cocos2d-x的开发的我们不是很习惯这种设计,其实和android是非常类似的,Cell子容器和代理方法,不就是android中的ListView的各种adapter吗?只是adapter整合了它们,在初始化adapter的时候会将数据和显示规则都定义好)


2.简单用法

(1)类定义

我想一般的用法会是自定义一个层作为ListView添加到其它层上,首先继承CCLayer,还要继承CCListViewDelegate,用来处理显示和回调CCListView,当然也可以继承于CCObject,但是要注意的是一定要定义一个visit()方法,用于更新!

#include "cocos2d.h"

#include "CCListView.h"

USING_NS_CC;
using namespace cocos2d::extension;

class ListViewDemoLayer: public CCLayer, public CCListViewDelegate
{
private:
    CCLabelTTF *m_InfoLabel;

private:
    // 存放的List数据
    std::list<std::string> *m_pDataList;
    CCListView *m_pListView;
    bool m_bFresh;
    
public:
    ListViewDemoLayer();
    ~ListViewDemoLayer();
    
    virtual bool init();
    
    LAYER_NODE_FUNC(ListViewDemoLayer);
    
    virtual void visit();
    
public:
    // 继承自CCListViewDelegate所需要实现的方法
    virtual void CCListView_numberOfCells(CCListView *listView, CCListViewProtrolData *data);
    virtual void CCListView_cellForRow(CCListView *listView, CCListViewProtrolData *data);
    virtual void CCListView_didClickCellAtRow(CCListView *listView, CCListViewProtrolData *data);
    virtual void CCListView_didScrollToRow(CCListView *listView, CCListViewProtrolData *data);
};

#endif

(PS:注意那鬼魅的命名作用域)


(2)自定义

用一个list<string>对象作为数据模拟显示,(如果是做道具店,装备商店列表,可能就是自定义类型的list了,因为数据结构会比较复杂,这里只是一个简单的字符串的例子而已)

// 初始化List数据
        m_pDataList = new std::list<std::string>;
        for (int i=0; i<15; i++) {
            char info[20];
            sprintf(info, "Cell %d", i);
            m_pDataList->push_back(info);
        }

定义一个CCListView对象,这里最重要的是要记得一定要设置其ContentSize(),如果不设置,则默认为0,什么都没有

// 初始化List数据
        m_pDataList = new std::list<std::string>;
        for (int i=0; i<15; i++) {
            char info[20];
            sprintf(info, "Cell %d", i);
            m_pDataList->push_back(info);
        }

还定义了一个CCLabelTTF用于显示ListView的信息

visit()方法还是很重要的,这是在cocos2d-x引擎每帧更新的时候都会调用的(比如动画的变化。。。),我们在这里可以判断当前的ListView需要不需要更新,当ListView有增减项的时候,为了达到显示同步,是需要更新的,调用listView.reload()

void ListViewDemoLayer::visit()
{
    CCLayer::visit();
    if (m_bFresh) {
        m_pListView->reload();
        m_bFresh = false;
    }
}

(3)CCListViewDelegate实现

virtual void CCListView_numberOfCells(CCListView *listView,CCListViewProtrolData *data);

返回ListView的条目数

virtual void CCListView_cellForRow(CCListView *listView,CCListViewProtrolData *data);

定义Cell的样式

在这里只简单的定义一个文本项,并且设置选中的背景色之类的

void ListViewDemoLayer::CCListView_cellForRow(cocos2d::extension::CCListView *listView, cocos2d::extension::CCListViewProtrolData *data)
{
    CCSize listSize = m_pListView->getContentSize();
    CCSize cellSize = CCSizeMake(listSize.width, listSize.height / 5);
    
    CCListViewCell *cell = CCListViewCell::node();
    cell->setOpacity(0);
    cell->setContentSize(cellSize);
    cell->setSelectionColor(ccc4(255, 0, 0, 255));
    data->cell = cell;
    
    std::list<std::string>::iterator it = m_pDataList->begin();
    for (int i=0; i<data->nRow; ++i) {
        ++it;
    }
    CCLabelTTF *cellLabel = CCLabelTTF::labelWithString(((std::string) *it).c_str(), "Arial", 32);
    cellLabel->setPosition(ccp(cellSize.width / 2, cellSize.height / 2));
    cell->addChild(cellLabel);
}

(PS:这个机制是类似于android中BaseAdapter的getView()方法的)


virtual void CCListView_didClickCellAtRow( CCListView *listView, CCListViewProtrolData *data);

ListView产生点击之后的回调

简单的修改一下显示文本,根据data->nRow得到当前项所在位置

void ListViewDemoLayer::CCListView_didClickCellAtRow(cocos2d::extension::CCListView *listView, cocos2d::extension::CCListViewProtrolData *data)
{
    char info[100];
    sprintf(info, "No. %d Row", data->nRow);
    m_InfoLabel->setString(info);
}

(PS:这个机制类似于android中ListView.setOnItemClickListener())


virtual void CCListView_didScrollToRow(CCListView *listView,CCListViewProtrolData *data);

ListView滑动产生的回调


3.效果





示例代码下载

cocos2d-x lua开发笔记:ListView加载多个item优化处理 实现lua下ListView加载大数量item的效率优化! 阅读详情

相关推荐

Cocos Studio及ListView使用简介

Cocos Studio版本:v2.3.2首先把需要用到的素材拷贝到项目文件夹res下,这里新建了一个imgs文件夹,将本次用到的素材拷贝到res/imgs/下,路径里不要包含中文。打开Cocos Studio后新建一个项目,在选择项目类型界面可以看到没有空项目可选,所以随便选择了一个示例,下一步后可以编辑项目名称,项目路径,点击完成之后可以看到生成的示例。因为不需要用到这些所以在左下角的资源窗口中

forestsenlin的博客 7689

quick-cocos2d-x中的ListView详解

在quick-cocos2dx中创建ListView的大步骤有2步: 1 创建一个ListView 2 创建ListView的Items

9527的专栏 9776

cocos2dx-3.2】UI控件之Listview

学过安卓的同学。对listview是很熟悉的。我作为一个学过并且有过一定研究

最怕认真 1万+

cocos2dx学习之UIListView.cpp

");return;if(!break;break;default:break;");break;break;break;default:break;else");break;break;break;default:break;else");if (!break;break;default:break;if (!return;return;

MARS的专栏 1477

Cocos2d-x学习):cocos2d-x 2.0CCListView用法 (转)

转自:http://blog.csdn.net/onerain88/article/details/7641126 cocos2d-x 2.0 版更新了,把opengl 1.1 替换为opengl 2.0,这个版本只能在iphone 3gs,android 2.2 以上版本才能跑,并且android的模拟器也不支持! 这次更新终于更新了几个UI控件,比如Button,Slider,Li

hhy018的专栏 1091

cocos2d-x 2.0CCListView用法

转自:http://blog.csdn.net/onerain88/article/details/7641126 cocos2d-x 2.0 版更新了,把opengl 1.1 替换为opengl 2.0,这个版本只能在iphone 3gs,android 2.2 以上版本才能跑,并且android的模拟器也不支持! 这次更新终于更新了几个UI控件,比如Button,Slider,

Gabriel的专栏 1140

cocos2d-x多分辨率自适配及因此导致的CCListView的bug修复

cocos2d-x多分辨率自适配及因此导致的CCListView的bug修复 cocos2d-x是一款众所周知的跨平台的游戏开发引擎。由于其跨平台的特性,多分辨率支持也自然就有其需求。 因此,在某一次更新中(抱歉,笔者已经忘了是哪次更新了),cocos2d-x添加了一个新的方法,可以非常简便地让cocos2d根据屏幕尺寸的大小做自适配。 方法名: virtual void

warrially的专栏 1179

Cocos2d-x学习笔记(二十)之 滚动列表类CCListView

  滚动列表类CCListViewCocos2D-x2.0及更高版本新增加的一个类。它继承与颜色布景层类CCLayerColor,继承关系如下:   CCListViewCCListViewCell->CCLayerColor。   CCListView类作为一个容器,它装载的CCListViewCell列表单元同样继承自颜色布景层类CCLayerColor。另外CCListView...

weixin_30551963的博客 160

cocos2d-x多分辨率和随后的自适应CCListView的bug修复

cocos2d-x多分辨率自适配及因此导致的CCListView的bug修复 cocos2d-x是一款众所周知的跨平台的游戏开发引擎。因为其跨平台的特性。多分辨率支持也自然就有其需求。 因此。在某一次更新中(抱歉,笔者已经忘了是哪次更新了),cocos2d-x加入了一个新的方法。能够很简便地让cocos2d依据屏幕尺寸的大小做自适配。 方法名: virtual ...

weixin_34248487的博客 116

去掉CCListView中的默认的网格线

最近在用cocos2d-x做一个电子书的项目,需要用到CCListView,可以CCListView中的每个cell都会有一条网格线,影响美观,所有要把它去掉。 后来发现在CCListViewCell.cpp中的draw函数,中,注释掉一段代码即可。   void CCListViewCell::draw(void) {     CCLayerColor::draw();

bestpool的专栏 1616

可耻的转载了别人的cocos2d-x的学习笔记

原文:http://blog.csdn.net/we000636/article/details/8263503 接受触屏事件的优先级是值越小,响应触屏事件的优先级越高 Z值越大,越外面 粒子系统设计工具:Particle Designer软件  目前只支持MAC平台 导出 plist文件 地图设计工具:Tiles 目前有两个版本,一个是Ja

爱在一毛钱 2240

CCListView去掉中间的横线

最近在用cocos2d-x做一个电子书的项目,需要用到CCListView,可以CCListView中的每个cell都会有一条网格线,影响美观,所有要把它去掉。 后来发现在CCListViewCell.cpp中的draw函数,中,注释掉一段代码即可。 [cpp] view plaincopy     void CCListViewCe

我的 572

Cocos2D-X 】初窥门径(14)CCTableView

!在2.X版本已经没有CCListView了,用CCTableView实现。 直接写 #include "cocos-ext.h" 或 using namespace cocos2d::extension; 会报错,因为没有添加额外的依赖。 添加依赖: 1.右键点击项目-&gt;属性-&gt;vc++-&gt;项目包含目录,将目录extensions包含进去。 2.继续选择,...

移动开发记录 170

cocos2d_x+lua【4.1】 ------ListView的使用

oDustGgg个人原创、欢迎转载、转载请注明出处、http://blog.csdn.net/odustggg/article/details/8171230 一、创建列表层 function create_listview() local layer = CCLayerColor:layerWithColorWidthHeight(ccc4(255, 0, 0, CORLORLAYER...

mmdev 263
上一篇: Cocos2d-x学习(七):cocos2d-x中ScrollView的简单实现
下一篇: Cocos2d-x学习(九):cocos2d-x 无限背景滚动
oneRain
博客等级 码龄16年 680粉丝 69原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值