第二十六篇:两个SOUI新控件 ---- SListView和SComboView(借用Andorid的设计)
SOUI原来实现的SListBoxEx的效率一直是我对SOUI不太满意的地方。包括后来网友实现的SListCtrlEx。
这类控件为每一个列表项创建一个SWindow来容纳数据,当数据量比较大(10000+)时,一方面内存消耗会很严重;另一方面列表数据初始化也需要大量的时间。
今年开始转型做Android开发。大家都知道Android开发APP和PC上开发APP相比要简单很多,其中我个人体会最深的就是Android的ListView控件。
在Android中,ListView中列表项的显示采用控件+适配器(Adapter)的模式,也就是所谓的MVC模式。一个表项在需要显示的时候才会把数据加载到View里去,当这个表项被隐藏起来以后,容纳该表项的容器(View)则自动被加入到ListView中保存的一个容器回收列表中。需要显示一个新表项时首先去回收站里查找是否存在指定类型的容器,存在则自动复用。
基本思想如上,当然实际实现还使用了很多技巧。通过上述机制,可以有效解决ListView显示大量数据的问题。
本来也一直想重写SOUI的ListBox, 这段时间正好项目需要,抽出时间模仿了一个,效果不错。
先看看效果:


第一张图是一个加载50000行的SListView控件,第二个图是演示使用SComboView来做用户登陆界面。
要在SOUI中使用SListView,我们首先需要自己实现一上数据填充的Adapter:
class CTestAdapter : public SAdapterBase
{
protected:
SListView * m_pOwenr;
public:
CTestAdapter(SListView *pOwner):m_pOwenr(pOwner)
{ }
virtual int getCount()
{
return ;
} virtual void getView(int position, SWindow * pItem)
{
if(pItem->GetChildrenCount()==)
{
pItem->InitFromXml(m_pOwenr->GetTemplate());
}
SAnimateImgWnd *pAni = pItem->FindChildByName2<SAnimateImgWnd>(L"ani_test"); SButton *pBtn = pItem->FindChildByName2<SButton>(L"btn_test");
pBtn->SetWindowText(SStringW().Format(L"button %d",position));
pBtn->SetUserData(position);
pBtn->GetEventSet()->subscribeEvent(EVT_CMD,Subscriber(&CTestAdapter::OnButtonClick,this));
} bool OnButtonClick(EventArgs *pEvt)
{
SButton *pBtn = sobj_cast<SButton>(pEvt->sender);
int iItem = pBtn->GetUserData();
SMessageBox(NULL,SStringT().Format(_T("button of %d item was clicked"),iItem),_T("haha"),MB_OK);
return true;
}
};
这里最关键的就是实现IAdapter中的getView方法。
和Android的ListView不同,SOUI中使用条件pItem->GetChildrenCount()==0来判断一个容器是否是被复用。
当pItem->GetChildrenCount()==0时代表该容器还没有被初始化,需要自己从XML模板中初始化容器。XML模板可以自己自己定义的任意符合SOUI布局语法的数据。
容器初始化完成后就可以向里面填充数据,也可以向控件连接响应函数了(subscribeEvent)。
在UI创建完成后需要在代码中把这个Adapter交给SListView:
LRESULT CMainDlg::OnInitDialog( HWND hWnd, LPARAM lParam )
{
//.... SListView *pLstView = FindChildByName2<SListView>("lv_test");
if(pLstView)
{
CTestAdapter *pAdapter = new CTestAdapter(pLstView);
pLstView->SetAdapter(pAdapter);
pAdapter->Release();
} return ;
}
第二个界面是演示SComboView的。SComboView的用户和SListView基本一样,具体看代码。
第二十六篇:两个SOUI新控件 ---- SListView和SComboView(借用Andorid的设计)的更多相关文章
- 第十篇:扩展SOUI的控件及绘图对象(ISkinObj)
尽管SOUI已经内置了大部分常用的控件,很显然内置控件很难满足各种应用的形式各异的需求. 因此只有提供足够的扩展性才能满足真实应用场景. 除了将系统尽可能的组件化外,SOUI在控件自绘(SWindow ...
- 第二十九篇:使用SOUI的SMCListView控件
列表控件是客户端应用最常用的控件之一.列表控件通常只负责显示数据,最多通知一下APP列表行的选中状态变化. 现在的UI经常要求程序猿在列表控件里不光显示内容,还要能和用户交互,显示动画等等,传统的列表 ...
- 第二十五篇:在SOUI中做事件分发处理
不同的SOUI控件可以产生不同的事件.SOUI系统中提供了两种事件处理方式:事件订阅 + 事件处理映射表(参见第八篇:SOUI中控件事件的响应) 事件订阅由于直接将事件及事件处理函数连接,不存在事件分 ...
- 第二十二篇:在SOUI中使用代码向窗口中插入子窗口
使用SOUI开发客户端UI程序,通常也推荐使用XML代码来创建窗口,这样创建的窗口使用方便,当窗口大小改变时,内部的子窗口也更容易协同变化. 但是最近不断有网友咨询如何使用代码来创建SOUI子窗口,特 ...
- 第二十六篇 jQuery 学习8 遍历-父亲兄弟子孙元素
jQuery 学习8 遍历-父亲兄弟子孙元素 jQuery遍历,可以理解为“移动”,使用“移动”还获取其他的元素. 什么意思呢?老师举一个例子: 班上30位同学,我是新来负责教这个班学生的老师 ...
- 第二十六篇 -- wifi学习
参考网址:https://blog.csdn.net/zwl1584671413/article/details/77936950 https://blog.csdn.net/Righthek/art ...
- 第二十四篇:导出SOUI对象到LUA脚本
LUA是一种体积小,速度快的脚本语言.脚本语言虽然性能上和C++这样的Naitive语言相比差一点,但是开发速度快,可以方便的更新代码等,近年来受到了越来越多开发者的重视. 在SOUI框架中,我把脚本 ...
- Python之路(第二十六篇) 面向对象进阶:内置方法
一.__getattribute__ object.__getattribute__(self, name) 无条件被调用,通过实例访问属性.如果class中定义了__getattr__(),则__g ...
- Python之路【第二十六篇】:HTTP协议
HTTP协议 一.HTTP概述 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则. HTTP就是通信规则 ...
随机推荐
- ORB-SLAM(四)追踪
最近在读ORB-SLAM的代码,虽然代码注释算比较多了,但各种类和变量互相引用,看起来有点痛苦.索性总结了一下Tracking部分的代码结构,希望能抓住主要思路,不掉坑里. 追踪 追踪部分的主要思路是 ...
- 5.Android消息推送机制简单例子
1.首先布局文件xml代码: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout x ...
- bzoj 3262 陌上花开
本质是一个三维偏序,一位排序后cdq分治,一维在子函数里排序,一维用树状数组维护. 把三维相等的合并到一个里面. #include<iostream> #include<cstdio ...
- python异常处理
1. 异常 (1) 异常处理 #没有异常处理 num = int('abc') print(num) #报错 #异常处理 try: num = int('abc') #try里的代码是受保护的 pri ...
- u盘安装Fedora23
-2.计划用ultraiso安装 fedora 23 ,然后从windows平台转到Linux平台上. -1.概念理解 硬盘模式:achi(sata) ide (ata) 分区格式:主引导记录(mbr ...
- Confuser.crproj
<?xml version="1.0" encoding="utf-8"?> <project baseDir="bin\Relea ...
- Holt-Winters原理和初始值的确定
关于模型 (来自以下PPT,从第4页开始) 关于初始值: 以下文档给出了三个模型的初始值计算的思路. 大致思路如下,建立一个p阶移动平均模型,估计出参数即为初始值,具体的根据三种不同的模型,有 ...
- 【html】学习记录-拖放(drag and drop)
目的:实现拖动目标并放置到指定区域. 使元素可拖动,涉及到元素的全局属性draggable <img draggable="true" /> 即img元素设置为可拖 ...
- ThinkPHP2.2框架执行流程图,ThinkPHP控制器的执行流程
ThinkPHP2.2框架执行原理.流程图在线手册 ThinkPHP控制器的执行流程 对用户的第一次URL访问 http://<serverIp>/My/index.php/Index/s ...
- CentOS6.3搭建Nginx代理访问MongoDB GridFS图片资源
PHP可以直接读取MongoDB GridFS中的图片并显示到页面中,但对PHP的压力就大了.偶然机会,了解到Nginx可以代理访问,实现过程如下: 1.工具准备 安装一些必要的编译工具及库,这里是直 ...