RecyclerView与ListView 比较分析:缓存机制

一. 背景

PS:相关知识:
ListView与RecyclerView缓存机制原理大概相像,如下图所示:

2018正版葡京赌侠诗 1

滑动进程中,离屏的ItemView即被回收至缓存,入屏的ItemView则会优先从缓存中赢得,只是ListView与RecyclerView的兑现细节有差距.(那只是缓存使用的里边一个景观,还有如刷新等)

二. 正文

2.1 缓存机制相比

  1. 层级分歧:
    RecyclerView比ListView多两级缓存,支持四个离ItemView缓存,帮忙开发者自定义缓存处理逻辑,扶助所有RecyclerView共用同一个RecyclerViewPool(缓存池)。

具体来说:
ListView(两级缓存):

2018正版葡京赌侠诗 2

RecyclerView(四级缓存):

2018正版葡京赌侠诗 3

ListView和RecyclerView缓存机制基本一致:

1).
mActiveViews和mAttachedScrap效用相似,意义在于飞快重用屏幕上可知的列表项ItemView,而不要求再行createView和bindView;
2). mScrapView和mCachedViews +
mReyclerViewPool成效相似,意义在于缓存离开屏幕的ItemView,目标是让即将进入屏幕的ItemView重用.
3).
RecyclerView的优势在于a.mCacheViews的运用,可以形成屏幕外的列表项ItemView进入屏幕内时也无须bindView神速重用;b.mRecyclerPool可以供两个RecyclerView共同选取,在特定情景下,如viewpaper+几个列表页下有优势.客观来说,RecyclerView在一定情景下对ListView的缓存机制做了补强和周密。

  1. 缓存分歧:

1). RecyclerView缓存RecyclerView.ViewHolder,抽象可通晓为:
View + ViewHolder(幸免每一回createView时调用findViewById) +
flag(标识状态);
2). ListView缓存View。

缓存不相同,二者在缓存的运用上也略大有不相同,具体来说:
ListView获取缓存的流程:

2018正版葡京赌侠诗 4

RecyclerView获取缓存的流程:

2018正版葡京赌侠诗 5

1).
RecyclerView中mCacheViews(屏幕外)获取缓存时,是经过匹配pos获取目标地点的缓存,那样做的利益是,当数据源数据不变的情事下,无须重新bindView:

2018正版葡京赌侠诗 6

而同等是离屏缓存,ListView从mScrapViews依据pos获取相应的缓存,然而并不曾一贯利用,而是重新getView(即必定会重新bindView),相关代码如下:

//AbsListView源码:line2345
//通过匹配pos从mScrapView中获取缓存
final View scrapView = mRecycler.getScrapView(position);
//无论是否成功都直接调用getView,导致必定会调用createView
final View child = mAdapter.getView(position, scrapView, this);
if (scrapView != null) {
    if (child != scrapView) {
        mRecycler.addScrapView(scrapView, position);
    } else {
                ...
    }
}

2). ListView中经过pos获取的是view,即pos–>view;
RecyclerView中通过pos获取的是viewholder,即pos –>
(view,viewHolder,flag);
从流程图中得以观看,标志flag的效果是判定view是否需求重新bindView,那也是RecyclerView实现部分刷新的一个主导。

2.2 局地刷新

由上文可知,RecyclerView的缓存机制真正越来越完善,但还不算质的扭转,RecyclerView更大的助益在于提供了部分刷新的接口,通过一些刷新,就能幸免调用许多不行的bindView。

2018正版葡京赌侠诗 7

(RecyclerView和ListView添加,移除Item效果比较)

组合RecyclerView的缓存机制,看看局地刷新是怎么促成的:
以RecyclerView中notifyItemRemoved(1)为例,最后会调用requestLayout(),使任何RecyclerView重新绘制,进度为:
onMeasure()–>onLayout()–>onDraw()

里头,onLayout()为紧要,分为三步:
dispathLayoutStep1():记录RecyclerView刷新前列表项ItemView的各样新闻,如Top,Left,Bottom,Right,用于动画的有关测算;
dispathLayoutStep2():真正测量布局大小,地点,主旨函数为layoutChildren();
dispathLayoutStep3():总结布局内外相继ItemView的情形,如Remove,Add,Move,Update等,如有需求履行相应的动画.

其中,layoutChildren()流程图:

2018正版葡京赌侠诗 8

2018正版葡京赌侠诗 9

当调用notifyItemRemoved时,会对屏幕内ItemView做预处理,修改ItemView相应的pos以及flag(流程图中肉色部分):

2018正版葡京赌侠诗 10

当调用fill()中RecyclerView.getViewForPosition(pos)时,RecyclerView通过对pos和flag的预处理,使得bindview只调用一次.

急需提议,ListView和RecyclerView最大的界别在于数据源改变时的缓存的处理逻辑,ListView是”一锅端”,将享有的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是进一步灵活地对各样View修改标志位,区分是否重新bindView。

三.结论

1、在有些情景下,如界面开头化,滑动等,ListView和RecyclerView都能很好地工作,两者并不曾很大的距离:

小说的始发便抛出了那般一个题目,微信Android客户端卡券模块,一大半UI都是以列表页的格局显得,完结形式为ListView,是否有必不可少校其替换成RecyclerView呢?

2018正版葡京赌侠诗 11

2018正版葡京赌侠诗,答案是否认的,从性质上看,RecyclerView并不曾拉动显明的升官,不必要频繁更新,暂不援救用动画,意味着RecyclerView优势也不太明朗,没有太大的吸引力,ListView已经能很好地满足工作必要。

2、数据源频仍更新的情形,如弹幕:http://www.jianshu.com/p/2232a63442d6 等RecyclerView的优势会非常引人注目;

一发来讲,结论是:
列表页显示界面,须求援救动画,或者反复更新,局地刷新,提议采纳RecyclerView,越发强硬完善,易扩大;其余情形(如微信卡包列表页)两者都OK,但ListView在运用上会越发有利于,急速。

相关文章