虚拟滚动列表实现原理-虚拟滚动实现原理
咱先不说那些正好整点、雷打不动的“起初、其次、最终”,也撇开教科书里那种“原理 - 机制 - 流程”的死板讲解。虚拟滚动列表这事儿,说白了就是给屏幕腾点地儿,让落单的用户自己来操作,而不是非得把手机插进插座才能跑得动。它最核心的逻辑,就是“先占位,后渲染”。 你想想手机屏幕那几厘米宽,一般/平平列表放个几十条数据,屏幕简直占满了,手指头头要是滑不动,哪怕你点了看,得点半天。
这时候虚拟滚动就派上用场了。它先把这几十条数据从内存里“拉出来”,暂时塞进一个小窗口里,然后屏幕就空出来了,手指头头就能滑来滑去,点进第一个看看,再滑出去持续看后面的了。等你点完,再把这些数据一块一块重新塞回去,屏幕又变回满屏状态。
这就叫“先占位,后渲染”。 实际操作里,你得先定义好这“占位”的窗口能容纳多少条数据。
比如目前有 100 条,窗口能存 20 条,那就要在 100 条里挑出 20 条塞进这个可用空间。剩下那 80 条,就跑到内存深处,别动,先放着。赶明儿新数据来了,要是不够塞,就再从深处拿出来塞进窗口;要是够塞了,那剩下的自然就不用管了。
这就好比正在装修的大房子,你先把走廊打通,让住户能走动,但房子里的房间还得留出来,不能全塞满,不然住户要挤着走。 这里有个关键点得搞清楚,就是“内循环”和“外循环”的区别。外循环就是上面说的一般/平平列表,数据是死板地按顺序排的,你滑得再快,它也不会变。内循环呢?就是虚拟滚动那个小窗口。它的特征是“哪位来了哪位先插队”。
比如你刚刷到第 10 条,突然第 50 条数据突然出现了。
这时候,第 50 条就得插到第 10 条前面去,不然顺序就乱了。你得把旧数据先往后挪一挪,腾出位置给新数据。 这就涉及到如何挪的算法了,这算是个微妙的平衡。
要是挪得忒狠,位置变了,用户可能滑到哪儿认定不对眼,得重新滑回来,体验就差了。
要是挪得忒省,新数据可能一辈子插不上前面,那就没法用了。
一般的处理方案是:新数据来了,先把它塞进窗口,然后慢慢往后挪旧数据,挪到捕捉不到为止。至于窗口里多出来的那些旧数据如何办?这就得看策略了。有的系统会直接删掉,反正之前没刷到,留着干嘛;有的可能拖回去,让用户刷着刷着自然就看到;还有的会尝试去“搜索”数据,比如利用相似度算法,看看同一条数据是不是已经存有过,要是存有了,就跳过这条,直接跳到下一条。
这就像是图书馆借书,新书来了,你得先借旧书腾个位置,旧书全借光了如何办?那就得看策略选不选。 再说说如何算“最优解”。
这个窗口的大小不是固定不变的。
有时候通个新闻,单条内容不长,窗口能够大一点,给用户多滑待会儿,看看是不是要追剧。
有时候新闻忒长,又要么是用户想查个详细的资料,窗口就得小一点,防止屏幕被占得慌。
这里的判断是个动态博弈。
一方面要算“带得动”,单条数据在窗口里的宽度不能超标,不然手指头头够不着;另一方面要算“留得下”,剩下的数据要是少到不能再少,直接删掉(这种记性不好的刷新),要么拖回去。
这就需求一套复杂的计算逻辑,估摸得多算好几遍,直到找到那个最平衡的点数。 为了说明白这种动态的过程,咱拿个具体例子看看。假设目前屏幕上显示着 100 条数据,窗口容量是 20 条。目前第 50 条数据突然来了。系统得先从那 80 条没显示的旧数据里挑出 20 条塞进窗口,然后把第 50 条推到第 10 条前面,接着把第 10 条往后推到第 20 条前面,以此类推,直到第 20 条往后推到第 40 条前面。
这时候窗口里的数据顺序就变成了 50, 49, 48...20。
接着系统得判断这 20 条旧数据里有没有已经存有过的。
比如第 18 条数据,是不是已经在后台加载过了?要是是,那就省着点,别重复加载了,直接跳过;要是不是,那就把这 18 条数据也往后挪一下,腾出位置给第 50 条。挪完赶明儿,第 18 条就得留到第 36 条前面去。
这样一挪,窗口就重新露出了第 37 个位置,用户能够点进去看第 37 条了。
这个过程要是每来一条数据都重新算一遍,那系统就得慢成 fossils。
故此这里面肯定得有个缓存机制,把挪动的结局先存起来,下次再来的时候,要是是同一条数据,直接复用;要是是新数据,再重新算。 另外还得提提一下“覆盖”的难题。有些场景下,新数据可能覆盖掉旧数据,比如你刚刷到一条视频,下一秒又刷到同一条视频(要么长度差不多)。
这时候如何排?要是严格按顺序排,用户就重复了。有的系统会给新数据一个挺高的优先级,让它直接塞进最前面,不管之前有没有。
这别看看起来有点乱,但在某些即时感挺强的应用里,用户可能更希望立马看到新信息,而不是纠结顺序。
这种优先级排序,比单纯的左右移动要复杂得多,涉及到权重计算,但目标只有一个,就是尽量不让用户重复看,与此同时保证新数据能立马被看到。 说到底,虚拟滚动列表就是把“有限的屏幕空间”和“无限的数据流量”做了一次巧妙的妥协。它不搞那种一刀切的排法,而是时刻盯着屏幕里那几十厘米的距离,算着手指头能滑多远,接着就想如何把剩下的数据塞进去,如何让人不至于找不着北。它就像个灵活的管家,看着你滑,你看着它,说不定哪天你的手指头头有点滑,它立马腾地给你腾个位置,让你能持续滑下去。
这种动态的、适应性的处理方式,才是它在现代应用中比那些死板列表更耐用的缘由。
声明:演示网站所有内容,若无特殊说明或标注,均来源于网络转载,仅供学习交流使用,禁止商用。若本站侵犯了你的权益,可联系本站删除。
