【已解决】UIListView的问题,拖动时内容会不停的闪现

我在页面上添加了个UIListView,程序启动后我发现内容会不停的闪现,也就是一会内容出现,一会消失了,也不知道是什么原因。还有就是那个initChildWithDataLength方法具体是做什么用的啊。
我是代码是这样写的
UILayer *ulShop = UILayer::create();
this->addChild(ulShop);

UIListView *listView = UIListView::create();
listView->setTouchEnable(true);
listView->setSize(CCSizeMake(640, 550));
listView->setPosition(ccp(0,130));


for (int i = 0; i < 5; ++i)
{
 Layout *layout = Layout::create();
 layout->addChild(CCUIHELPER->createWidgetFromJsonFile("Shop/Shop.json"));
 layout->setPosition(ccp(0,i*188));


 listView->addChild(layout);
}
listView->initChildWithDataLength(188);

// listView->addEventListenter(this, listvieweventselector(ShopScene::listViewEvent));
ulShop->addWidget(listView);

因为是最开始预先初始化一部分控件,for (int i = 0; i < 5; ++i)
就是五个,然后后面的要在update中生成,如果你位置排的不对的话,就会到第六个控件生成的时候造成位置的跳动

那具体要怎么改呢,我只需要生成5个,然后每个layout高度就是188

只要五个的话就是把那个initChildWithDataLength(5),如果init是五个的话,就不用Update里面的方法体了

关键不是我要多少个的问题,我只是想知道为什么我这么添加,拖动的时候会内容会闪现。刚开始没明白initChildWithDataLength的意思,现在才知道还有什么预加载,initChildWithDataLength才是总数

楼主你好,

  1. 闪烁问题出在 layout->setPosition(ccp(0,i*188)) 这一行,配置子项控件的位置顺序反了。
    listview 每 1 个子项控件需要按照从上到下的顺序配置的。
    请参考 TestCpp 工程 UIListViewTest.cpp 中 bool UIListViewTest_Vertical::init() 的代码,重点是以下几行:
    layout->setSize()
    layout->setPosition(ccp((listWidth - panel_size.width) / 2,
    (listHeight - (panel_size.height + panel_size.height * 0.25)) - i * (panel_size.height + panel_size.height * 0.25)));
  2. initChildWithDataLength 接口为 listview 配置数据的总数。同时 initChildWithDataLength 接口在 listview 内部执行 initChildEvent 事件。
    逻辑层需要在事件回调函数中初始化 listview 每个子项控件的数据,比如楼主创建的 5 个子项,以下是楼主的代码片段:
    for (int i = 0; i < 5; ++i)
    {
    Layout *layout = Layout::create();
    layout->addChild(CCUIHELPER->createWidgetFromJsonFile(“Shop/Shop.json”));
    }

以 UIListViewTest.cpp 中回调函数的代码来举例,UIListViewTest.cpp 中可以这样实现回调时的数据初始化:
在 LISTVIEW_EVENT_INIT_CHILD case 块中
UIListView* list = dynamic_cast<UIListView*>(pSender);
int index = list->getUpdateDataIndex();
UIWidget* initChild = list->getUpdateChild();

getUpdateDataIndex 返回初始化数据的索引,因为创建了 5 个子项控件,所以回调函数中 case LISTVIEW_EVENT_INIT_CHILD: 块的代码会执行 5 次,返回的数据索引是 0~4
getUpdateChild 返回要初始化的子项控件对象,因为创建了 5 个子项控件,所以回调函数中 case LISTVIEW_EVENT_INIT_CHILD: 块的代码会执行 5 次,返回的 list view 的子项控件顺序是 0~4。
这样实现了为 listview 中所有的子项控件初始化数据。

pipu 你好,
谢谢你的解答,显示的问题已经解决了,
现在就是UIListView回调有些问题,
初始化后case LISTVIEW_EVENT_INIT_CHILD:没进出,好像是初始化后回调函数,
但是拖动的时候进去了case LISTVIEW_EVENT_UPDATE_CHILD:
我想问下没有初始化后case LISTVIEW_EVENT_INIT_CHILD:没有进去是什么原因

回 6 楼(末日)的帖子
可能是 initChildWithDataLength 和 addEventListenter 接口的调用顺序问题
正确的调用顺序为:
listView->addEventListenter(this, listvieweventselector(UIListViewTest_Vertical::listViewEvent));
listView->initChildWithDataLength(m_array->count());