美文网首页
基于duilib的虚拟列表实现

基于duilib的虚拟列表实现

作者: 43ce3d72fadb | 来源:发表于2018-12-13 17:05 被阅读37次

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

在邮箱大师选择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,向上滚动到临界条件

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


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

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

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

相关文章:
【推荐】 实战案例:如何快速打造1000万+播放量的抖音网红?

相关文章

  • 基于duilib的虚拟列表实现

    本文由作者邹启文授权网易云社区发布。 在邮箱大师选择duilib作为UI开发库后,我们面临这样一个问题。随着时间的...

  • 网络文件共享服务

    实现基于DB文件的虚拟用户FTP服务 实现基于MySQL的虚拟用户FTP服务 实现基于NFS共享服务的http实时...

  • duilib 各种消息列表

    duilib中各控件响应的消息类型 用法:

  • 基于Duilib的win32程序实现最小化到托盘

    最近在学习使用Duilib,这个库实现PC程序的界面确实很方便。Duilib中的demo程序全是点击关闭按钮程序就...

  • Redis深度历险-快速列表

    Redis深度历险-快速列表 快速列表就是为了实现list的功能,是基于压缩列表和双向链表的集合实现,主要是规避普...

  • duilib 的简单实现

    对于duilib库的学习,首先我们要学会站在别人的肩膀上来思考,这样会学的更快,所以这里我推荐一个博客duilib...

  • 7.1-Flutter中列表组件ListView

    基于ListView实现水平和垂直方向滚动列表 实现垂直滚动列表 也可以使用ListView.Builder更加高...

  • duilib相关资料

    Duilib[https://github.com/duilib/duilib]是一个Windows下免费开源的D...

  • Redis数据类型 - Lists

    一般来说,列表是有序元素的序列:10、20、1、2、3是一个列表。基于数组实现的列表和基于链表( Linked L...

  • Duilib性能优化——列表控件

    Duilib中本来就有列表控件CListUI,但是它不适用于数据量较大的情况: 每一个item都会在内存中有对应的...

网友评论

      本文标题:基于duilib的虚拟列表实现

      本文链接:https://www.haomeiwen.com/subject/vcubhqtx.html