博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第二十六篇:两个SOUI新控件 ---- SListView和SComboView(借用Andorid的设计)
阅读量:6574 次
发布时间:2019-06-24

本文共 2358 字,大约阅读时间需要 7 分钟。

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 50000;    }       virtual void getView(int position, SWindow * pItem)    {        if(pItem->GetChildrenCount()==0)        {            pItem->InitFromXml(m_pOwenr->GetTemplate());        }        SAnimateImgWnd *pAni = pItem->FindChildByName2
(L"ani_test"); SButton *pBtn = pItem->FindChildByName2
(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
(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
("lv_test"); if(pLstView) { CTestAdapter *pAdapter = new CTestAdapter(pLstView); pLstView->SetAdapter(pAdapter); pAdapter->Release(); } return 0;}

 

 

第二个界面是演示SComboView的。SComboView的用户和SListView基本一样,具体看代码。

转载于:https://www.cnblogs.com/setoutsoft/p/4691790.html

你可能感兴趣的文章
解密Angular WebWorker Renderer (二)
查看>>
parceljs 中文文档24小时诞生记
查看>>
五年 Web 开发者 star 的 github 整理说明
查看>>
Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo
查看>>
ReactNative字体大小不随系统字体大小变化而变化
查看>>
中台之上(五):业务架构和中台的难点,都是需要反复锤炼出标准模型
查看>>
为什么中台是传统企业数字化转型的关键?
查看>>
使用模板将Web服务的结果转换为标记语言
查看>>
inno setup 打包脚本学习
查看>>
php 并发控制中的独占锁
查看>>
从pandas到geopandas
查看>>
用express搭建网站
查看>>
如何在 Swift 中进行错误处理
查看>>
[Leetcode] Factor Combinations 因数组合
查看>>
用tinypng插件创建gulp task压缩图片
查看>>
BetaMeow----利用机器学习做五子棋AI
查看>>
APM终端用户体验监控分析(下)
查看>>
React Native 0.20官方入门教程
查看>>
JSON for Modern C++ 3.6.0 发布
查看>>
Tomcat9.0部署iot.war(环境mysql8.0,centos7.2)
查看>>