入屏的ItemView则会优先从缓存中获得,入屏的ItemView则会优先从缓存中赢得

一. 背景

PS:相关知识:
ListView与RecyclerView缓存机制原理差不离相似,如下图所示:

图片 1

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

一. 背景

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

图片 2

滑动进度中,离屏的ItemView即被回收至缓存,入屏的ItemView则会优先从缓存中赢得,只是ListView与RecyclerView的实现细节有差距.(那只是缓存使用的中间四个境况,还有如刷新等)

二. 正文

二. 正文

贰.一 缓存机制相比

  1. 层级不相同:
    RecyclerView比ListView多两级缓存,扶助八个离ItemView缓存,补助开发者自定义缓存处理逻辑,辅助具备RecyclerView共用同一个RecyclerViewPool(缓存池)。

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

图片 3

RecyclerView(4级缓存):

图片 4

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

1).
mActiveViews和mAttachedScrap功用相似,意义在于赶快重用显示器上可知的列表项ItemView,而不必要重新createView和bindView;
2). mScrapView和mCachedViews +
mReyclerViewPool成效相似,意义在于缓存离开显示屏的ItemView,目标是让即将进入荧屏的ItemView重用.
叁).
RecyclerView的优势在于a.mCacheViews的行使,能够形成显示屏外的列表项ItemView进入显示屏内时也无须bindView快速重用;b.mRecyclerPool能够供四个RecyclerView共同利用,在特定情景下,如viewpaper+八个列表页下有优势.客观来说,RecyclerView在一定情景下对ListView的缓存机制做了补强和周详。

  1. 缓存分裂:

壹). RecyclerView缓存RecyclerView.ViewHolder,抽象可精通为:
View + ViewHolder(防止每便createView时调用findViewById) +
flag(标识状态);
2). ListView缓存View。

缓存差别,2者在缓存的选用上也略大有径庭,具体来说:
ListView获取缓存的流程:

图片 5

RecyclerView获取缓存的流程:

图片 6

壹).
RecyclerView中mCacheViews(荧屏外)获取缓存时,是透过相称pos获取指标地方的缓存,那样做的功利是,当数据源数据不变的情形下,无须重新bindView:

图片 7

而相同是离屏缓存,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 {
                ...
    }
}

二). ListView中通过pos获取的是view,即pos–>view;
RecyclerView中经过pos获取的是viewholder,即pos –>
(view,viewHolder,flag);
从流程图中得以观察,标志flag的出力是判定view是还是不是须要重新bindView,那也是RecyclerView完毕部分刷新的五个基本。

贰.一 缓存机制相比

  1. 层级差异:
    RecyclerView比ListView多两级缓存,辅助多少个离ItemView缓存,援救开发者自定义缓存处理逻辑,帮助具备RecyclerView共用同3个RecyclerViewPool(缓存池)。

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

图片 8

RecyclerView(4级缓存):

图片 9

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

1).
mActiveViews和mAttachedScrap功能相似,意义在于飞速重用显示器上可知的列表项ItemView,而不供给再行createView和bindView;
二). mScrapView和mCachedViews +
mReyclerViewPool作用相似,意义在于缓存离开荧屏的ItemView,指标是让即将进入荧屏的ItemView重用.
三).
RecyclerView的优势在于a.mCacheViews的施用,能够完毕荧屏外的列表项ItemView进入显示屏内时也无须bindView飞速重用;b.mRecyclerPool能够供多少个RecyclerView共同利用,在特定情景下,如viewpaper+八个列表页下有优势.客观来说,RecyclerView在特定情景下对ListView的缓存机制做了补强和健全。

  1. 缓存不一样:

一). RecyclerView缓存RecyclerView.ViewHolder,抽象可清楚为:
View + ViewHolder(防止每一次createView时调用findViewById) +
flag(标识状态);
2). ListView缓存View。

缓存分歧,二者在缓存的利用上也略大有径庭,具体来说:
ListView获取缓存的流程:

图片 10

RecyclerView获取缓存的流程:

图片 11

一).
RecyclerView中mCacheViews(显示屏外)获取缓存时,是通过匹配pos获取指标地点的缓存,那样做的裨益是,当数据源数据不变的气象下,无须重新bindView:

图片 12

而同等是离屏缓存,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 {
                ...
    }
}

二). ListView中通过pos获取的是view,即pos–>view;
RecyclerView中经过pos获取的是viewholder,即pos –>
(view,viewHolder,flag);
从流程图中得以看出,标志flag的意义是判定view是或不是供给重新bindView,这也是RecyclerView完毕部分刷新的3个主干。

二.二 局地刷新

由上文可见,RecyclerView的缓存机制真正越来越完善,但还不算质的变通,RecyclerView越来越大的优点在于提供了部分刷新的接口,通过某个刷新,就能制止调用许多不行的bindView。

图片 13

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

组合RecyclerView的缓存机制,看看局地刷新是如何达成的:
以RecyclerView中notifyItemRemoved(一)为例,最后会调用requestLayout(),使全体RecyclerView重新绘制,进程为:
onMeasure()–>onLayout()–>onDraw()

中间,onLayout()为第三,分为三步:
dispathLayoutStep1():记录RecyclerView刷新前列表项ItemView的各类新闻,如Top,Left,Bottom,Right,用于动画的有关测算;
dispathLayoutStep二():真正衡量布局大小,地点,核心函数为layoutChildren();
dispathLayoutStep三():计算布局内外相继ItemView的气象,如Remove,Add,Move,Update等,如有供给实施相应的动画.

其中,layoutChildren()流程图:

图片 14

图片 15

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

图片 16

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

亟需建议,ListView和RecyclerView最大的区分在于数据源改变时的缓存的处理逻辑,ListView是”壹锅端”,将兼具的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是越来越灵敏地对每一种View修改标志位,区分是还是不是重新bindView。

2.贰 局地刷新

由上文可见,RecyclerView的缓存机制真正越来越完善,但还不算质的浮动,RecyclerView更加大的帮助和益处在于提供了部分刷新的接口,通过有些刷新,就能幸免调用许多无效的bindView。

图片 17

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

组合RecyclerView的缓存机制,看看局地刷新是何许落实的:
以RecyclerView中notifyItemRemoved(1)为例,最终会调用requestLayout(),使全部RecyclerView重新绘制,进度为:
onMeasure()–>onLayout()–>onDraw()

其间,onLayout()为首要,分为三步:
dispathLayoutStep壹():记录RecyclerView刷新前列表项ItemView的各个音讯,如Top,Left,Bottom,Right,用于动画的相关测算;
dispathLayoutStep二():真正衡量布局大小,地点,主旨函数为layoutChildren();
dispathLayoutStep3():计算布局内外相继ItemView的情状,如Remove,Add,Move,Update等,如有要求实施相应的动画.

其中,layoutChildren()流程图:

图片 18

图片 19

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

图片 20

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

亟待建议,ListView和RecyclerView最大的区别在于数据源改变时的缓存的拍卖逻辑,ListView是”一锅端”,将全体的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是更灵活地对每一个View修改标志位,区分是还是不是重新bindView。

三.结论

1、在部分风貌下,如界面初叶化,滑动等,ListView和RecyclerView都能很好地劳作,两者并从未十分大的反差:

小说的发轫便抛出了这么三个难题,微信Android客户端卡券模块,超越五成UI都以以列表页的款型呈现,完结形式为ListView,是不是有必不可大校其替换到RecyclerView呢?

图片 21

答案是不是定的,从性质上看,RecyclerView并不曾拉动显然的升级换代,不需求频仍更新,暂不支持用动画,意味着RecyclerView优势也不太驾驭,没有太大的魔力,ListView已经能很好地满足工作供给。

二、数据源频繁更新的现象,如弹幕:http://www.jianshu.com/p/2232a63442d6 等RecyclerView的优势会极度精通;

越来越来讲,结论是:
列表页体现界面,要求支持动画,可能反复更新,局地刷新,提出利用RecyclerView,更压实劲完善,易扩充;别的情形(如微信钱包列表页)两者都OK,但ListView在运用上会更加方便,神速。

三.结论

一、在一些气象下,如界面开端化,滑动等,ListView和RecyclerView都能很好地劳作,两者并不曾十分大的歧异:

文章的上马便抛出了这么1个标题,微信Android客户端卡券模块,抢先二分之一UI都以以列表页的款式呈现,实现方式为ListView,是或不是有须要将其替换来RecyclerView呢?

图片 22

答案是还是不是定的,从性质上看,RecyclerView并未带来显著的升迁,不要求反复更新,暂不补助用动画,意味着RecyclerView优势也不太明朗,未有太大的吸重力,ListView已经能很好地满意工作须要。

二、数据源频仍更新的气象,如弹幕:http://www.jianshu.com/p/2232a63442d6 等RecyclerView的优势会要命惹人注目;

一发来讲,结论是:
列表页展现界面,需求接济动画,也许屡屡更新,局地刷新,提议接纳RecyclerView,尤其有力完善,易扩张;其它意况(如微信钱袋列表页)两者都OK,但ListView在应用上会尤其有益于,火速。

相关文章