cocos2d-x改底层之动态改变UIListView中的某项在链表中的位置

先看一下UIListView添加、插入、删除的机制,再来考虑如何移动某一项在链表中得位置。

UIListView.h

/* 所有项用一个数组来保存 */
CCArray* _items;
void ListView::pushBackCustomItem(Widget* item)
{
    /* 向数组中添加一项 */
    _items->addObject(item);
    remedyLayoutParameter(item);
    addChild(item);
    _refreshViewDirty = true;
}

void ListView::insertCustomItem(Widget* item, int index)
{
    /* 向数组中插入一项 */
    _items->insertObject(item, index);
    remedyLayoutParameter(item);
    addChild(item);
    _refreshViewDirty = true;
}

void ListView::removeItem(int index)
{
    Widget* item = getItem(index);
    if (!item)
    {
        return;
    }
    /* 从数组中移除一项 */
    _items->removeObject(item);
    removeChild(item);
    _refreshViewDirty = true;
}

由此可见,链表中所有项的管理仅仅是由数组来存储的,所以移动一项的位置也就很简单了:

/* 声明一个位置移动函数,让某项移动到链表中的某个位置,参数1:某项当前位置,参数2:某项的目标位置 */
void changeItemOrder(int curIdx,int tarIdx);
void ListView::changeItemOrder( int curIdx,int tarIdx )
{
	if (curIdx == tarIdx)
	{
		return;
	}

	Widget* item = getItem(curIdx);
	if (!item)
	{
		return;
	}
    /* 重新调整项item的位置:移除再重新插入 */
    _items->removeObject(item);
    _items->insertObject(item, tarIdx);
    /* 调整布局,并打开刷新开关 */
    remedyLayoutParameter(item);
    _refreshViewDirty = true;

    //sortAllChildren();
}

使用:

listView->changeItemOrder(5,0);//将索引为5的项移到链表的开头成为第一项

时间: 2024-12-23 14:42:24

cocos2d-x改底层之动态改变UIListView中的某项在链表中的位置的相关文章

动态改变Listview的item背景颜色和item中字体的颜色

首先非常感谢原文章作者. 今天项目用到Listview点击item变色.网上找了好久,都没有找到简单的方法,好像只能重写getview(): 网上找到了一个比较简单的例子,但是不懂为什么,先记录下来以后慢慢学习. <span style="font-size:24px;">package leoli.com.focuslistview; import android.graphics.Color; import android.support.v7.app.AppCompa

cocos2d-x改底层之获取UIListView的实际内容大小

实际项目中UI界面中经常会用到UIListView,大多会在CocoStudio中直接添加这个控件.但是在使用中发现了一些坑和功能缺乏,然 后就看了一下底层的逻辑,发现稍微改一下底层就可以满足需求,所以下面就针对需求来分析UIListView的底层,同时做一些改动. 需求:根据链表中的内容来动态调整listView本身的大小 首先,我们要知道,我们插入和移除链表中的一项,listView本身会如何处理: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 void ListV

动态改变actionbar的menu菜单MenuItem的显示

onCreateOptionsMenu(Menu menu)方法中我们能够通过getMenuInflater().inflate(R.menu.list_option, menu);来构建一个菜单,并通过 1 menu.findItem(R.id.menu) 获得具体的一个菜单项.但这个onCreateOptionsMenu在activity的整个周期中只被调用一次,之后都不会变化,于是在android的较新版本里有了onPrepareOptionsMenu方法. onCreateOptions

动态改变 网页的宽度 &lt;--&gt; body的滚动条

1. <body style="min-width:600px;overflow:scroll;" allowfullscreen="true"> </body> 当网页的宽度 缩小到 比 min-width的值小时,<body/>就会出现 水平滚动条. 2. 动态改变 <body/> 的 min-width属性: js代码:document.body.style.minWidth = 数值 + "px&qu

蓝牙广播数据格式和动态改变

本文由嵌入式企鹅圈原创团队成员黄鑫提供. 广播内容的自定义是蓝牙BLE开发的基本技能,用户最多能够设置31字节.但是用户定义是必须要遵循BLE协议的.另外,ibeacon应用和一些特定的应用要利用广播来传递数据,而且不同时间段的广播内容还会改变,如ibeacon的major/minor和电量显示等待.本文即阐述蓝牙的广播数据格式和动态改变. 参考文档:bluetooth specification version 4.0, p1735-p1738 一.广播数据格式 总共31字节,由一个或者多个广

U3DPlayer UnityWebPlayer动态改变src

单机问题解决了,接下来是动态src的问题,之前有看到过有解决方案的. 今天参考了:Unity动态改变src的解决方法 - 智周万物 我的目的是实现可以打开任意.unity3d文件的功能,把他的代码整理了一下,能删的删,做成了一个用户控件,代码: public partial class U3DPlayer : UserControl { public static U3DPlayer AppendTo(Control parent, string path) { try { U3DPlayer 

js动态改变图片src在ie6下的兼容问题

场景:验证码图片在ie6下出不来 这个BUG折腾了我近半个小时,最后GOOGLE成功,原因是IE6的底层BUG,我们使用<a>的href属性改变的时候会中断加载,导致我们看不到图片,这经常在验证码或动态改变图片的时候遇到. 所以我们在使用a 链接时通常href和onclick都会同时用到,链接的 onclick 事件被先执行,其次是 href 属性下的动作(页面跳转,或 javascript 伪链接),假设链接中同时存在 href 与 onclick,如果想让 href 属性下的动作不执行,o

autolayout高度动态改变的一些体会

autolayout这个东西就不在此说明了,网上已经有很多大神做了很详细的讲解,自己也看了不少好文章,在这里只是想记录一下自己初步的一些认识与体会,这个东西毕竟还是很强大,如果要用到更高级的用法还得在研究. 首页这边先描述一个动态cell,然后先进行一些必要的布局,布局完大概是这个样子 主要是关注测试label,标题和图片的布局这边只要固定边距或固定宽高就可以了.首先有没有一种情况就是cell高度固定,然后让这个测试label动态增长到一定行数,假设测试label动态增长到2行,那我们首页就要设

Android动态改变布局,比如登陆弹出软键盘,登陆框上移(转载)

Android动态改变布局 http://www.cnblogs.com/angeldevil/p/3836256.html 遇到这么个需求,先看图:      其实是一个软件的登录界面,初始是第一个图的样子,当软键盘弹出后变为第二个图的样子,因为登录界面有用户名.密码.登录按钮,不这样的话软键盘弹出后会遮住登录按钮(其实之前的实现放到了ScrollView里面,监听软键盘弹出后滚动到底部,软键盘隐藏后滚动到顶部,也是可以的). 最简单的方法就是多加几个冗余的View,根据软键盘的状态隐藏不需要