TableView和ListView的使用

来源:互联网 发布:abode acrobat for mac 编辑:程序博客网 时间:2024/05/21 17:01

在游戏中,我们经常看到一些用来展示好友的列表或者展示一些道具的列表,如下图:



在这里,我们就来学学这种控件列表是如何使用的。

1.TableView

TabelView包含在cocos-ext.h头文件中,所以使用时要把它包含进来,同时声明其命名空间USING_NS_CC_EXT;

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
#include "cocos-ext.h"
using namespace std;
USING_NS_CC_EXT;
class HelloWorld : public cocos2d::Layer,public TableViewDataSource,public TableViewDelegate
{
public:
    
    
    static cocos2d::Scene* createScene();

    virtual bool init();

    void menuCloseCallback(cocos2d::Ref* pSender);

    //滚动的时候会调用(可选)
    virtual void scrollViewDidScroll(ScrollView* view);
    //缩放的时候会调用(可选)
    virtual void scrollViewDidZoom(ScrollView* view);
    //点击条目时回调
    virtual void tableCellTouched(cocos2d::extension::TableView* table, cocos2d::extension::TableViewCell* cell);
    //Cell就是每一个条目,这个函数是设置cell的大小
    virtual cocos2d::Size tableCellSizeForIndex(cocos2d::extension::TableView *table, ssize_t idx);
    //添加Cell,每个cell的样式通过该函数创建并且返回
    virtual cocos2d::extension::TableViewCell* tableCellAtIndex(cocos2d::extension::TableView *table, ssize_t idx);
    //设置Cell个数
    virtual ssize_t numberOfCellsInTableView(cocos2d::extension::TableView *table);
    CREATE_FUNC(HelloWorld);
    
    
    
};

#endif // __HELLOWORLD_SCENE_H__

让使用TableView的类去继承TableViewDataSource和TableViewDelegate,因为这两个类是纯虚函数,所以必须去实现它们的一些函数,这些函数也是TabelView的监听函数和创建是所需的函数(例如cell大小,数目,所显示的内容),到时候给TabelView设置委托的时候,只需把this传递进去,就OK了。(学过安卓的朋友可能更加容易理解,安卓中称为ListView,创建ListView需要给他设置适配器,适配器类中的一些抽象方法由开发者自己实现,即编写自己的适配器,适配器中的方法仍然和上面一样,有设置条目数目,所显示的内容等等,开发者只需创建一个类或者让当前类去继承它并实现这些抽象函数,再把适配器对象设置给ListView就行了),所以在这里,我们的HelloWorld继承了TableViewDataSource和TableViewDelegate,本身也算得上是一个适配器了。

再来看看实现方面:

#include "HelloWorldScene.h"
#include "Hero.h"
USING_NS_CC;


Scene* HelloWorld::createScene()
{
    auto scene = Scene::create();
    
    auto layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}




bool HelloWorld::init()
{


    if ( !Layer::init() )
    {
        return false;
    }
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/galleryLayer.plist");
    auto winSize=Director::getInstance()->getWinSize();
  
    //创建TableView对象 参数是TableView控件的大小
    TableView* tableView = TableView::create(this,Size(440,winSize.height));
    tableView->setDirection(ScrollView::Direction::VERTICAL);//设置TableView方向
    tableView->ignoreAnchorPointForPosition(false);//是否忽略对锚点的设置 false为否
    tableView->setAnchorPoint(Vec2::ZERO);//设置锚点
    tableView->setPosition(Vec2::ZERO);//设置位置

    //设置TableView的属性 TOP_DOWN 条目从上往下添加 BOTTOM_UP条目从下往上添加
    tableView->setVerticalFillOrder(TableView::VerticalFillOrder::TOP_DOWN);
    tableView->setDelegate(this);//设置委托 即设置了其回调和创建相关函数
    this->addChild(tableView);
    tableView->reloadData();//更新数据

    return true;
}
//scrollview滚动的时候会调用
void HelloWorld::scrollViewDidScroll(ScrollView* view)
{
    
}
//scrollview缩放的时候会调用
void HelloWorld::scrollViewDidZoom(ScrollView* view)
{
    
}

//条目点击事件
void HelloWorld::tableCellTouched(cocos2d::extension::TableView* table, cocos2d::extension::TableViewCell* cell)
{

    //table  TableView本省

    //cell 为被点击的条目

    //to do some thing
}
Size HelloWorld::tableCellSizeForIndex(cocos2d::extension::TableView *table, ssize_t idx)//Cell大小
{
    return Size(440, 187);
}
TableViewCell* HelloWorld::tableCellAtIndex(cocos2d::extension::TableView *table, ssize_t idx)//添加Cell
{

    //获取之前的cell
    TableViewCell* cell = table->dequeueCell();

    //如果为空,则创建
    if(!cell)
    {
        cell = new TableViewCell();
        cell->autorelease();
    }
    cell->removeAllChildrenWithCleanup(true);
    Sprite* sprNormal;
    sprNormal->setAnchorPoint(Vec2::ZERO);
    sprNormal->setPosition(Vec2::ZERO);
    cell->addChild(sprNormal);
    return cell;
}

//设置cell个数
ssize_t HelloWorld::numberOfCellsInTableView(cocos2d::extension::TableView *table)
{
    return 5;
}

2.ListView

使用ListView所需头文件和命名控件

#include "cocos-ext.h"
#include "ui/CocosGUI.h"
using namespace ui;

创建ListView

void PhotoGalleryLayer::addListView()
{
   //创建ListView
    auto listView=ListView::create();
    //设置ListView方向 垂直
    listView->setDirection(ListView::Direction::VERTICAL);
    //可触摸交互
    listView->setTouchEnabled(true);
    //反弹
    listView->setBounceEnabled(true);
    //大小
    listView->setSize(Size(445, 500));
    //是否忽略size使用Texture size
    listView->ignoreContentAdaptWithSize(false);
    listView->setAnchorPoint(Vec2::ZERO);
    listView->setPosition(Vec2(0,120));
    //监听事件
    listView->addEventListener(CC_CALLBACK_2(PhotoGalleryLayer::selectedItemEvent, this));
    //创建ListView所需条目
    
    /*第一参数:默认状态下图片 第二参数:选择状态下图片
      第三参数:禁用状态下图片 第四参数:所用资源是plist文件还是本地图片
     Button::TextureResType::PLIST为plist Button::TextureResType::LOCAL为本地*/

    Button* wood_item = Button::create("Cell_0.png", "CellSel_0.png", "", Button::TextureResType::PLIST);
    Button* lion_item = Button::create("Cell_1.png", "CellSel_1.png", "", Button::TextureResType::PLIST);
    Button* stone_item = Button::create("Cell_2.png", "CellSel_2.png", "", Button::TextureResType::PLIST);
    Button* unKnow_item = Button::create("Cell_3.png", "CellSel_3.png", "", Button::TextureResType::PLIST);
    //添加条目
    listView->pushBackCustomItem(wood_item);
    listView->pushBackCustomItem(lion_item);
    listView->pushBackCustomItem(stone_item);
    listView->pushBackCustomItem(unKnow_item);
    this->addChild(listView);
}

以上是把Button作为ListView的Item,Item可以根据你所要展示的内容自定义设置,可以是一个Layer里面包含各种控件,可以显示图片,文字等等,最后再把Layer作为Item设置给ListView。

ListView条目点击回调函数

void PhotoGalleryLayer::selectedItemEvent(Ref* ref,ListView::EventType type)
{
    //开始点击
    if(type==ListView::EventType::ON_SELECTED_ITEM_START)
    {
        auto listView=(ListView*)ref;
        //当前显示条目的下标  从0开始,表示第一个条目
        auto idnex=listView->getCurSelectedIndex();
        switch (idnex) {
            case 0:

                //第一个条目被点击

                break;
            case 1:

                //第一个条目被点击

                break;

         }

     }

}

效果如下图所示:





0 0