time:2015/05/04

1. 描述

  在cocostudio中有两个控件,一个listview,另外一个是隐藏的imageview,其中后者作为listview的元素。每次使用的时候把ImageView设置为默认的item(setItemModel),然后通过listview:pushBackDefaultItem进行插入指定个数的元素。但是在使用过程中会修改listview中的元素(通过getItem得到其中的元素),结果修改了listview的元素之后作为默认itemmodel的ImageView的属性也被修改了。eg:ImageView下面有一个node也是ImageView,一直都是可见的,但是修改完之后也会变成不可见的

2.原因

(1)分析

* 查看自己的代码setItemModel和pushBackDefaultItem两个接口的源码表示每次都是clone一个新的控件出来,所以getItem不会拿到作为itemmodel的控件并且修改其属性的

* 再看自己使用的代码:每次的ItemModel都是通过seekWidgetByName得到的

* 综合前面两点,很有可能就是seekWidgetByName的时候得到的item控件并不是UI界面上的那个,而是clone出来的,因为tag和name完全一样

Widget* Widget::clone()
{
Widget* clonedWidget = createCloneInstance();
clonedWidget->copyProperties(this);
clonedWidget->copyClonedWidgetChildren(this);
return clonedWidget;
}

(2)验证

* 比较每次seekWidgetByName出来的item,都是false,这说明的确不一样

* 修改获取item的方式,第一次读取UI界面的时候保存为全局的,每次就直接使用,比较每次的结果都是true(变量一样,当然都是一样的)

3.解决

(1)第一次加载UI界面(json)文件的时候把需要用到的控件保存下来(这里就是这个listview要用到的item),不要每次都通过seekWidgetByName去查找

4. 总结

(1)listview的pushBackDefaultItem是每次clone一个新的控件的,但是会把所有的属性复制过去,包括唯一标识一个控件的name和tag

(2)seekWidgetByName是根据名字或者tag进行深度优先遍历(其实是中序遍历),但是如果有相同的名字的控件就会出现问题,找到第一个相同名字的就直接返回了

(3)一个UI界面第一次加载的时候用seekWidgetByName找到后面要用的控件,以后不要通过这种方式去查找了,不但效率上有影响,而且还会出现问题

listview的pushBackDefaultItem中的item属性被修改问题的更多相关文章

  1. 【转】visio中关于shape属性的修改和读取

    PS:  本文转自: http://blog.sina.com.cn/s/blog_6bcfb9420100wzxf.html visio中都是shape,shape就是一个对象,要想实现对shape ...

  2. python继承关系中,类属性的修改

    class Grandfather(object): mylist = [] def __init__(self): pass class Father(Grandfather): pass Gran ...

  3. 文件重命名之动态改动ListView里指定Item中的组件属性

    在Android实际开发过程中常常会遇到,改动ListView中某一项的值.怎样达到这一目的呢? 方法主要有两种: 第一种方式:当ListView中某一项的值发生变化之后,又一次载入数据已达到更新Li ...

  4. Android ListView 之 SimpleAdapter 二 (包含 item 中按钮监听)

    1    MainActivity.java package com.myadapter; import java.util.ArrayList; import java.util.HashMap; ...

  5. Android处理ListView中的Item中的Button按钮不能点击的问题

    问题描述:ListView列表中的Button按钮按钮不能点击 解决办法:在ListView中的Item项的布局文件中加上:android:descendantFocusability="b ...

  6. Android动态加载ListView中的Item

    我这周上网看到动态增加listview的每一项item的布局,今天抽空自己写了一个,方便自己日后使用,这个效果还是很不错的,用到了Adapter的notifyDataSetChanged()方法,当点 ...

  7. VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题

    VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题:https://blog.csdn.net/jerrica/article/d ...

  8. android中xml tools属性详解

    第一部分 安卓开发中,在写布局代码的时候,ide可以看到布局的预览效果. 但是有些效果则必须在运行之后才能看见,比如这种情况:TextView在xml中没有设置任何字符,而是在activity中设置了 ...

  9. android中xmlns:tools属性详解

    今天读到一篇总结的非常棒的文章,写的逻辑很清晰也很实用,很少见到如此棒的文章了.就原文转发过来,我把格式给整理了一下,分享给园子里的各位朋友!好久没写博客了,就为2015年的11月留份纪念吧.希望对你 ...

随机推荐

  1. accessToken的使用

    1.accessToken是啥,干嘛用? 形象解释:申请调兵-->皇帝同意-->兵符-->开始调兵 拿到用户在第三方平台的唯一的标识; 获取用户的nickname,头像,邮箱等其他信 ...

  2. 使用wireshark出现Couldn't run /usr/bin/dumpcap in child process: Permission denied解决办法

    sudo apt-get install libcap2-bin wireshark sudo chgrp myusername /usr/bin/dumpcap # myusername是你使用wi ...

  3. linux mint 18.2 安装wireshark

    Method 1: Via PPA Step 1: Add the official PPA sudo add-apt-repository ppa:wireshark-dev/stable Step ...

  4. MYSQL的NOW和SYSDATE函数的区别

    在MySQL Performance Blog博客上看到一篇文章介绍now()和sysdate()函数. 想起很多朋友专门问在MySQL里面提供now()和sysdate()函数,都是表示取得当前时间 ...

  5. ZOJ 2971 Give Me the Number

    Give Me the Number Numbers in English are written down in the following way (only numbers less than  ...

  6. 《Think Python》第5章学习笔记

    目录 5.1 整除和取模(Floor division and modulus) 5.2 布尔表达式(Boolean expressions) 5.3 逻辑运算符(Logical operators) ...

  7. 【转】WinForm窗体显示和窗体间传值

    以前对WinForm窗体显示和窗体间传值了解不是很清楚 最近做了一些WinForm项目,把用到的相关知识整理如下 A.WinForm中窗体显示 显示窗体可以有以下2种方法: Form.ShowDial ...

  8. WPF 确认动态加载数据完成

    整个wpf程序是读取xml文件生成的,所以当数量较大而且结构复杂的时候,就会出现显示一个空白(我这里设置了背景色,所以显示黑屏,默认是空白的)的窗口,然后才显示控件. 但现在要求必须在控件显示完成后才 ...

  9. xsl 和xml transform方法的调用

    xsl 和xml生成html,兼容多个浏览器 <html> <head> <meta charset="UTF-8"/> </head&g ...

  10. 【转】Java策略消除if else

    策略(Strategy)模式:又名Policy,它的用意是定义一组算法,把它们一个个封装起来,并且使他们可以相互替换.策略模式可以独立于使用他们的客户端而变化.GOF策略模式静态结构类图如下: 通过上 ...