一.duilib中list的自定义使用(一个界面中只有一个自定义list)

list是duilib中的基本控件,是一种基本的表格,可以自定义表格的各种基本属性(颜色,边框,字体等),类似于下图的基本效果,显示的是5列7行的一个列表。

1.xml文件的编写

listtest.xml(list列表控件)

<?xml version="1.0" encoding="UTF-8"?>
<Window size="1280,768" caption="0,0,0,36" roundcorner="0,0" ><Include source="Default.xml" /><VerticalLayout  bkcolor="#FFFFFFFF" ><HorizontalLayout height="500" width="1220" inset="20,20,0,0"><List name="expenserecordlist" width="1190" height="500" bkcolor="#FFFFFFFF" inset="0,0,0,0" itemshowhtml="true" vscrollbar="true" hscrollbar="true" headerbkimage="file='list_header_bg.png'" itemalign="center" hscrollbar="false" menu="true"><ListHeader height="40" menu="true" scaleheader="true" bkcolor="#FFFFFFFF" ><ListHeaderItem text="时间"  font="2" scale="17" textcolor="#FF151515" hotimage="file='list_header_hot.png'" pushedimage="file='list_header_pushed.png'" sepimage="file='list_header_sep.png'" sepwidth="1"/><ListHeaderItem text="类型"  font="2" scale="14" textcolor="#FF151515" hotimage="file='list_header_hot.png'" pushedimage="file='list_header_pushed.png'" sepimage="file='list_header_sep.png'" sepwidth="1"/><ListHeaderItem text="金额"  font="2" scale="13" textcolor="#FF151515" hotimage="file='list_header_hot.png'" pushedimage="file='list_header_pushed.png'" sepimage="file='list_header_sep.png'" sepwidth="1"/><ListHeaderItem text="余额"  font="2" scale="13" textcolor="#FF151515" hotimage="file='list_header_hot.png'" pushedimage="file='list_header_pushed.png'" sepimage="file='list_header_sep.png'" sepwidth="1"/><ListHeaderItem text="备注"  font="2" scale="40" textcolor="#FF151515" hotimage="file='list_header_hot.png'" pushedimage="file='list_header_pushed.png'" sepimage="file='list_header_sep.png'" sepwidth="1"/></ListHeader></List></HorizontalLayout></VerticalLayout>
</Window>

listitem.xml(自定义列表中的列)

<?xml version="1.0" encoding="UTF-8"?>
<Window><!-- <Font shared="true" id="1" name="微软雅黑" size="12" default="true" /> --><ListContainerElement><HorizontalLayout height="32"><HorizontalLayout width="180"><Label name="time"  align="center" valign="center" textcolor="#FF727272" /></HorizontalLayout><HorizontalLayout width="220"><Label name="type"  align="center" valign="center" textcolor="#FF727272"  /></HorizontalLayout><HorizontalLayout width="110"><Label name="amount"  align="center" valign="center" textcolor="#FF727272" /></HorizontalLayout><HorizontalLayout width="190"><Label name="balance"  align="center" valign="center" textcolor="#FF727272" /></HorizontalLayout><HorizontalLayout width="490"><Label name="remarks"  align="center" valign="center" textcolor="#FF727272" /></HorizontalLayout></HorizontalLayout></ListContainerElement>
</Window>

2.代码示例

//往消费记录列表添加节点
bool CTestDialog::AddNodeOfExpenserecordList(const UserExpenseRecordInfo& info)
{CListUI* pList = static_cast<CListUI*>(m_PaintManager.FindControl(_T("listtest")));if (NULL == pList){return false;}CListContainerElementUI* pListElement = NULL;//CDialogBuilder m_dlgBuilderExpendList  此处是m_dlgBuilderExpendList  的类型if (!m_dlgBuilderExpendList.GetMarkup()->IsValid()){pListElement = static_cast<CListContainerElementUI*>(m_dlgBuilderExpendList.Create(_T("listitem.xml"), (UINT)0, NULL, &m_PaintManager));}else{pListElement = static_cast<CListContainerElementUI*>(m_dlgBuilderExpendList.Create((UINT)0, &m_PaintManager));}if (pListElement == NULL){return false;}CLabelUI* pLab = static_cast<CLabelUI*>(m_PaintManager.FindSubControlByName(pListElement, _T("time")));if (pLab != NULL){pLab->SetBorderSize(1);pLab->SetBorderColor(0xFFBDBDBD);pLab->SetFont(2);pLab->SetText(info.wstrData.c_str());}pLab = NULL;pLab = static_cast<CLabelUI*>(m_PaintManager.FindSubControlByName(pListElement, _T("type")));if (pLab != NULL){pLab->SetBorderSize(1);pLab->SetBorderColor(0xFFBDBDBD);pLab->SetFont(2);pLab->SetText(info.wstrType.c_str());}pLab = NULL;pLab = static_cast<CLabelUI*>(m_PaintManager.FindSubControlByName(pListElement, _T("remarks")));if (pLab != NULL){pLab->SetBorderSize(1);pLab->SetBorderColor(0xFFBDBDBD);pLab->SetFont(2);pLab->SetText(info.wstrRemarks.c_str());}pLab = NULL;pLab = static_cast<CLabelUI*>(m_PaintManager.FindSubControlByName(pListElement, _T("amount")));if (pLab != NULL){pLab->SetBorderSize(1);pLab->SetBorderColor(0xFFBDBDBD);pLab->SetFont(2);pLab->SetText(info.wstrAmount.c_str());}pLab = NULL;pLab = static_cast<CLabelUI*>(m_PaintManager.FindSubControlByName(pListElement, _T("balance")));if (pLab != NULL){pLab->SetBorderSize(1);pLab->SetBorderColor(0xFFBDBDBD);pLab->SetFont(2);pLab->SetText(info.wstrBalance.c_str());}pListElement->SetBorderSize(1);pListElement->SetBorderColor(0xFFBDBDBD);pListElement->SetFixedWidth(1190);pListElement->SetFixedHeight(EXPENSE_RECORD_LIST_ITEM_HEIGH);int index = pList->GetCount();if (!pList->AddAt(pListElement, index)){delete pListElement;return false;}return true;
}

二.一个界面中存在两个或者多个自定义类型的list

类似于上述例子,是描述的在一个页面中也就是一个xml显示界面中,只存在一个自定义的list控件,假如在一个界面中需要有两种及以上的其他类型的list控件(也就是list的列属性是不同的,如上listitem.xml中配置中的一样,存在多个类型的listitem.xml)

也许我们会直接采用跟上述基本方法一样的做法,只是把配置的xml文件替换一下,我当时也是这样干的。。。,效果是很明显的,明显错误,加载的自定义的列配置文件,总是第一个加载的xml,后续的新的xml文件压根没家在生效。

如何解决这种情况?

经过一段时间的折腾,发现了一个解决方法,关键就在如下代码:

    CListContainerElementUI* pListElement = NULL;if (!m_dlgBuilderExpendList.GetMarkup()->IsValid())  //m_dlgBuilderExpendList 这才是问题解决点{pListElement = static_cast<CListContainerElementUI*>(m_dlgBuilderExpendList.Create(_T("ExpenseRecordListItem.xml"), (UINT)0, NULL, &m_PaintManager));}else{pListElement = static_cast<CListContainerElementUI*>(m_dlgBuilderExpendList.Create((UINT)0, &m_PaintManager));}if (pListElement == NULL){return false;}

上述代码段中 m_dlgBuilderExpendLis是问题的解决关键点,下面是m_dlgBuilderExpendLis 的定义:

CDialogBuilder m_dlgBuilderExpendList;

CDialogBuilder是一个duilib的类,可以切换到duilib的源码中看一下具体的各种细节和关联代码,会与更清楚的认识。

对于一个单独的界面,基本都存在对应的xml,每个单独的界面都有一个对应的类,而每一个类需要加载自定义的list的xml文件则必须定义一个CDialogBuilder类对象。

当一个界面(一个类)中需要加载多个自定义的list控件时,针对每一个list控件定义对应的CDialogBuilder对象即可,在代码中载入xml时使用不同的CDialogBuilder类对象即可,代码如下:

类头文件中定义两个CDialogBuilder类对象

private:
CDialogBuilder m_dlgBuilder;    //加载listitem.xml
CDialogBuilder m_dlgBuilderExpendList;   //加载ExpenseRecordListItem.xml
//可以添加多个自定义list控件

在类的是cpp文件中使用

CListContainerElementUI* pListElement = NULL;if (!m_dlgBuilderExpendList.GetMarkup()->IsValid()){pListElement = static_cast<CListContainerElementUI*>(m_dlgBuilderExpendList.Create(_T("ExpenseRecordListItem.xml"), (UINT)0, NULL, &m_PaintManager));}else{pListElement = static_cast<CListContainerElementUI*>(m_dlgBuilderExpendList.Create((UINT)0, &m_PaintManager));}if (pListElement == NULL){return false;}
CListContainerElementUI* pListElement0 = NULL;if (!m_dlgBuilder.GetMarkup()->IsValid()){pListElement0 = static_cast<CListContainerElementUI*>(m_dlgBuilder.Create(_T("listitem.xml"), (UINT)0, NULL, &m_PaintManager));}else{pListElement0 = static_cast<CListContainerElementUI*>(m_dlgBuilder.Create((UINT)0, &m_PaintManager));}if (pListElement0 == NULL){return;}

duilib在同一个界面中(xml)加载两种自定义的list相关推荐

  1. 图片在xml文件中直接加载.9文件

    图片在xml文件中直接加载.9文件,可能会因为图片压缩的缘故产生锯齿,如果使用 ImageView imageview = (ImageView) view .findViewById(R.id.in ...

  2. NetworkStateView:界面多状态加载

    本文来自简书,原文地址:http://www.jianshu.com/p/858d41972d15 在项目中经常需要进行不同状态的加载,例如在网络请求时的加载中状态,加载失败状态,没有网络状态和没有数 ...

  3. html页面判断其他div为空,将外部html加载到div中 - 页面加载然后变为空白

    我确信这将会变成一件愚蠢的事情,但是自从我成为JavaScript noob以来,这里就变成了一件愚蠢的事情.将外部html加载到div中 - 页面加载然后变为空白 我想外部HTML内容加载到我的索引 ...

  4. JDBC中驱动加载的过程分析

    JDBC中驱动加载的过程分析 作者:kenty  来源:博客园  发布时间:2007-08-20 15:01  阅读:1100 次  原文链接   [收藏]    本篇从java.sql.Driver ...

  5. JAVA Web.xml 加载顺序

    web.xml加载过程(步骤): 1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> ...

  6. Android中WebView加载sdcard中的html时提示:ERR_FILE_NOT_FOUND和ERR_ACCESS_DENIED

    场景 Android中WebView加载sdcard中的html显示: Android中WebView加载sdcard中的html显示_BADAO_LIUMANG_QIZHI的博客-CSDN博客 在实 ...

  7. Spring中ApplicationContext加载机制和配置初始化

    转自:http://liuwei1578.blog.163.com/blog/static/495803642007116111923195/ Spring中ApplicationContext加载机 ...

  8. uni中动态加载class_SpringBoot中使用LoadTimeWeaving技术实现AOP功能

    1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 AOP--面向切面编程,通过为目标类织入切面的方式,实现对目标类功能的增强.按切面被织如到目标类中的时间划分,主要有以下几 ...

  9. jquery完成界面无刷新加载登陆注册

    昨天公司说官网的登陆注册每次要跳转到另一个界面,能不能做一个简单的,在界面弹出一个框框登陆,我想了想做了这么一个案例,大家来看看成不成 贴上代码,实现了在同一个弹出窗上加载了登陆注册功能!可自由点击! ...

  10. qml中loader加载页面会闪屏_Qml动态语言切换

    此方法需要在Qt5.10或更高版本实现, 在Qt5.10或更高版本实现, 在Qt5.10或更高版本实现 重要的事情说三遍 首先在工程文件.pro中加入TRANSLATIONS = zh_CN.ts ...

最新文章

  1. 少侠,找个千手观音来帮你营销可好?
  2. react native中有关日期的组件DatePicker 示例
  3. 新CIO:Mark Schwartz认为的领先IT
  4. 工作绩效数据、工作绩效信息和工作绩效报告的区别
  5. St_geometry 初始用
  6. Linux mysqladmin 命令
  7. ftp linux 开启验证_Linux认证系统管理:linux下搭建ftp
  8. java 包含字符串 个数_java查找字符串中的包含子字符串的个数实现代码
  9. 《码出高效:Java开发手册
  10. Pr 视频效果:过渡、透视、通道
  11. URAL 1787. Turn for MEGA
  12. MXY---Docker
  13. 基于多租户的云计算Overlay网络
  14. 类似铸剑物语的java游戏_怀旧向:GBA上的10款经典RPG游戏推荐,这些你都玩过吗?...
  15. grep exclude
  16. GoldenGate的安全配置
  17. 29.Android展示PDF文件
  18. 2022天梯L1-L2题解
  19. uniapp 收藏功能实现及组件封装
  20. Python遍历字典的几种方式

热门文章

  1. java jquery时间问候语,js实现实时问候,不同时间显示不同问候语
  2. 流程生产订单和离散生产订单的区别_离散式生产和流程式生产的区别
  3. 开机广播没反映_我州首部反映脱贫攻坚成效的电影《冲锋号》在鹤峰开机
  4. Introduction to Computer Networking学习笔记(十八):Switching 交换工作实现
  5. php baseconvert,mb_convert_encoding
  6. java内存分配 图_java运行内存分配图(转)
  7. CentOS 7.6环境设置Redis开机自启动
  8. Redis的缓存数据过期策略,内存淘汰机制
  9. 关于【缓存穿透、缓存击穿、缓存雪崩、热点数据失效】解决方案
  10. 10种软件滤波方法的示例程序