本文由作者邹启文授权网易云社区发布。

在邮箱大师选择duilib作为UI开发库后,我们面临这样一个问题。随着时间的积累,用户数据会越来越多,如何保证我们的软件在展示这些数据时依然保持非常好的体验?

原生态duilib列表的实现是,数据与控件(列表的每一项)一一对应,即有多少数据,便有多少控件。通过粗略测试,我们发现,当数据量达到10000封邮件时,仅仅是构造这10000个控件就需要花费16s,也就是说在这16s内,用户无法操作软件,这是我们无法接受的。所以,我们决定改进duilib列表,通过虚拟化的方式解决这个问题。

虚拟化,就是,对于10000封邮件,我们并不需要构造10000个控件,因为真正可以让用户看见的不超过20(根据屏幕高度和控件高度计算)个控件,那么,我们可以通过反复利用这20个控件来达到展示10000封邮件的目的。

那么,具体如何实现呢?很简单,在鼠标上下滚动的时候,我们对这20个控件重新布局(更改其位置)和更新其内容。

但是,产品和视觉提出了一个需求,给列表滚动加上动画效果,即用户滚动列表松开鼠标后,列表内容仍要向上或向下以一定的速度前进,之后才停下来。那么,上面的方案便行不通,因为20个控件在滚动时不断重新布局和更新内容比较耗时,会导致列表出现卡顿式的前进,用户体验太差。如何解决这个问题呢?

我们的解决办法是采用100个控件。这样,在滚动时判断是否需要重新布局,如果不需要,则直接刷新绘制新的邮件内容,如果到了临界条件,那么再重新布局然后绘制新的邮件内容。具体做法如下:

临界条件的判断:

  假设滚动条的位置为yScrollPos,列表的区域为rcList,第一个列表项的位置为rcFirst,最后一个列表项的位置为rcLast。

  当yScrollPos > (rcLast.bottom-rcList.top)-rcList.Height时,为向下滚动的临界条件;

  当yScrollPos < rcFirst.top-rcList.top时,为向上滚动的临界条件。

1,向下滚动到临界条件

特别注意:存在靠近最底部时重新布局的情况,100个列表项的后面不可见的一部分项可以置为无效。

2,向上滚动到临界条件

特别注意:存在靠近顶部时重新布局的情况,此时,与上面图不同的是,大部分项会布局在下面,少部分在上面,但是没有关系,因为此后向上滚动,不会再触发重新布局。

目前邮箱大师中,虚拟列表应用在邮件列表、通讯录列表、写信联系人列表等,极大提高了软件运行性能和体验,而且运行稳定。

免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

更多网易技术、产品、运营经验分享请访问网易云社区

相关文章:
【推荐】 npm和package.json那些不为常人所知的小秘密
【推荐】 视觉设计师的进化
【推荐】 验证码的作用

基于duilib的虚拟列表实现的更多相关文章

  1. 【转】Power System 中基于 VIOS 的虚拟以太网实现

    基于 VIOS 的虚拟以太网适配器的工作原理和配置实现 本文对 Power 系统中基于 VIOS 的虚拟以太网适配器(Virtual Ethernet Adapter)的工作原理.基本配置选项和配置步 ...

  2. 性能优化:虚拟列表,如何渲染10万条数据的dom,页面同时不卡顿

    列表大概有2万条数据,又不让做成分页,如果页面直接渲染2万条数据,在一些低配电脑上可能会照成页面卡死,基于这个需求,我们来手写一个虚拟列表 思路 列表中固定只显示少量的数据,比如60条 在列表滚动的时 ...

  3. 在Nginx中部署基于IP的虚拟主机

    一.虚拟主机概念 虚拟主机是在网络服务器上划分出一定的磁盘空间供用户放置站点.应用组件等,提供必要的站点功能.数据存放和传输功能.所谓虚拟主机,也叫"网站空间", 就是把一台运行在 ...

  4. nginx基于IP的虚拟主机

    知识点: server的语法: upstream语法: upstream中192.168.100.1不是ip只是个标识,只要和下面的proxy_pass 对应即可. 基于IP的虚拟主机: listen ...

  5. CListView虚拟列表

    首先说下虚拟列表出现的原因: 数据量比较小的时候,对于CListView控件可以直接使用InsertItem并配合SetItemText函数来插入并修改数据.这样操作很直接. 但是,如果数据量比较大了 ...

  6. apache2 httpd 基于域名的虚拟主机配置 for centos6X 和debian-8

    全系统虚拟主机: for debian 系统的apache2 域名 虚拟主机

  7. clistctrl 虚拟列表

    一.什么是虚拟列表控件 虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件.. 二.为什么使用虚拟列表控件 我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示 ...

  8. 基于VMware的虚拟Linux集群搭建-lvs+keepalived

    基于VMware的虚拟Linux集群搭建-lvs+keepalived 本文通过keepalived实现lvsserver的的双机热备和真实server之间的负载均衡.这方面的blog挺多,可是每一个 ...

  9. Centos6.5中Nginx部署基于IP的虚拟…

    Centos6.5 中Nginx 部署基于IP 的虚拟主机 王尚2014.11.18 一.介绍虚拟主机 虚拟主机是使用特殊的软硬件技术,把一台真实的物理电脑主机 分割成多个逻辑存储单元,每个单元都没有 ...

随机推荐

  1. connect strings sql server

    https://www.connectionstrings.com/sql-server/ Server=myServerAddress[,port];Database=myDataBase;User ...

  2. Python 的stat 模块

    #!/usr/bin/env python#-*- encoding:UTF-8 -*- import os,time,stat fileStats = os.stat ( 'test.txt' )  ...

  3. 使用delphi 开发多层应用(二十四)KbmMW 的消息方式和创建WIB节点

    KbmMW 中支持基于UDP的消息广播,也支持TCP/IP hub/spoke 方式,还有 基于UDP或者TCP/IP 的点对点的消息传输. 1.基于UDP的消息广播

  4. 2018.09.07 codeforces311B. Cats Transport(斜率优化dp)

    传送门 斜率优化dp好题. 对于第i只猫,显然如果管理员想从出发开始刚好接到它,需要在t[i]=h[i]−dist(1,i)" role="presentation" s ...

  5. 2018.08.28 集合堆栈机(模拟+STL)

    描述 中学数学里集合的元素往往是具体的数字,比如A = {1,2,3},B = {}(空集)等等.但是要特别注意,集合的元素也可以是另一个集合,比如说C = {{}},即说明C有且仅有一个元素--空集 ...

  6. 【Unity】1.1 安装Unity 5.3.4 开发环境

    分类:Unity.C#.VS2015 创建日期:2016-03-23 一.简介 Unity分个人版(Personal)和专业版(Pro).个人版是免费的(部分高级功能受限,但初学者也用不到它),Pro ...

  7. POJ 3686 The Windy's (最小费用流或最佳完全匹配)

    题意:有n个订单m个车间,每个车间均可以单独完成任何一个订单.每个车间完成不同订单的时间是不同的.不会出现两个车间完成同一个订单的情况.给出每个订单在某个车间完成所用的时间.问订单完成的平均时间是多少 ...

  8. 端口模式(IN,OUT,INOUT,BUFFER)

    in: OUT: INOUT: BUFFER:缓冲模式,与OUT类似可作为输出使用,但也可把输出的信号作为输入使用.

  9. GoogleStyle格式化代码

    <div class="iteye-blog-content-contain" style="font-size: 14px"></div&g ...

  10. PAT甲 1046. Shortest Distance (20) 2016-09-09 23:17 22人阅读 评论(0) 收藏

    1046. Shortest Distance (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The ...