第二十六篇:两个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就是通信规则 ...
随机推荐
- bzoj4282慎二的随机数列
海带头又上线了QwQ~ 这是一个奇怪的lis问题 显然一定存在一种最优答案使所有辨认不清的数都在答案中. [为什么呢]因为你完全可以用一个'N'来替换一个'K'啊QwQ~ 那么在选完所有'N'之后,一 ...
- 初步搭建RocketMQ环境
1. 去官网https://github.com/alibaba/RocketMQ/releases下载alibaba-rocketmq-3.2.6.tar.gz,这个是已经maven install ...
- CSS3选择器:nth-of-type
碰到了个选择器,:nth-of-type <!DOCTYPE html> <html> <head> <meta http-equiv="Conte ...
- 点评前端开发工具cortex安装使用方法
cortex安装方法: 安装最新版 sudo npm install -g cortex cortex config set registry http://registry.cortexjs.org ...
- fscanf()函数基本用法
FILE *fp; while(!feof(fp)) { fscanf(fp,"%s%d%lf",a,&b,&c);//这里%s对应的a不需要加上取地址符号& ...
- live555库中的testH264VideoStreamer实例
1.h264文件的推送 testH264VideoStreamer.cpp文件的开头就定义了 char const* inputFileName = "test.264"; 后面接 ...
- 全屏滚动效果H5FullscreenPage.js
前提: 介于现在很多活动都使用了 类似全屏滚动效果 尤其在微信里面 我自己开发了一个快速构建 此类项目的控件 与市面上大部分控件不同的是此控件还支持元素的动画效果 并提供多种元素效果 基于zepto. ...
- tyvj1089 smrtfun
背景 广东汕头聿怀初中 Train#2 Problem3 描述 现有N个物品,第i个物品有两个属性A_i和B_i.在其中选取若干个物品,使得sum{A_i + B_i}最大,同时sum{A_i},s ...
- iPad版微信终于来临了 微信5.4版搜索更智能 转账就是发消息
等待甚久的iPad版微信终于来临了!昨日微信iOS版本更新至5.4.0.16,新增功能包括搜索公众号.识别图中二维码.面对面收钱,同时适配iPad.(微信5.4安卓版重回ios风格 导航菜单都放底栏位 ...
- nginx自动检测后台服务器健康状态
转自http://www.iyunv.com/thread-38535-1-1.html 公司业务线上对后端节点的健康检查是通过nginx_upstream_check_module模块做的,这里我将 ...