ListView与RecyclerView缓存机制原理大致相似公海赌船网址,入屏的ItemView则会优先由缓存中拿到

一. 背景

PS:相关文化:
ListView与RecyclerView缓存机制原理大致相似,如下图所示:

公海赌船网址 1

滑过程遭到,离屏的ItemView即被回收到缓存,入屏的ItemView则会优先由缓存中得,只是ListView与RecyclerView的贯彻细节来异异.(这只有是缓存使用的里一个景,还有如刷新等)

一. 背景

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

公海赌船网址 2

滑过程遭到,离屏的ItemView即被回收及缓存,入屏的ItemView则会优先由缓存中落,只是ListView与RecyclerView的实现细节爆发两样异.(这单是缓存使用的里一个现象,还有如刷新等)

二. 正文

二. 正文

2.1 缓存机制相比较

  1. 层级不同:
    RecyclerView比ListView多简单层缓存,襄助多单离ItemView缓存,帮忙开发者自定义缓存处理逻辑,补助所有RecyclerView共用以及一个RecyclerViewPool(缓存池)。

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

公海赌船网址 3

RecyclerView(四层缓存):

公海赌船网址 4

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获取缓存的流水线:

公海赌船网址 5

RecyclerView获取缓存的流程:

公海赌船网址 6

1).
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 {
                ...
    }
}

2). ListView中经过pos获取之是view,即pos–>view;
RecyclerView中经过pos获取的凡viewholder,即pos –>
(view,viewHolder,flag);
从今流程图中得以看到,标志flag的来意是判断view是否需要重新bindView,这为是RecyclerView实现部分刷新的一个主干。

2.1 缓存机制相比较

  1. 层级不同:
    RecyclerView比ListView多简单层缓存,扶助多单离ItemView缓存,协助开发者自定义缓存处理逻辑,襄助所有RecyclerView共用和一个RecyclerViewPool(缓存池)。

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

公海赌船网址 8

RecyclerView(四层缓存):

公海赌船网址 9

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获取缓存的流水线:

公海赌船网址 10

RecyclerView获取缓存的流水线:

公海赌船网址 11

1).
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 {
                ...
    }
}

2). ListView中经过pos获取之是view,即pos–>view;
RecyclerView中经过pos获取之是viewholder,即pos –>
(view,viewHolder,flag);
起流程图中可以看出,标志flag的用意是判断view是否需要重新bindView,这吗是RecyclerView实现有刷新的一个着力。

2.2 局部刷新

鉴于上文可知,RecyclerView的缓存机制真正越来越全面,但尚未算质的扭转,RecyclerView更充分之长在于提供了有的刷新的接口,通过有些刷新,就可知避免调用许多没用的bindView。

公海赌船网址 13

(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()流程图:

公海赌船网址 14

公海赌船网址 15

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

公海赌船网址 16

当调用fill()中RecyclerView.getViewForPosition(pos)时,RecyclerView通过对pos和flag的先处理,使得bindview只调用同样坏.

消提出,ListView和RecyclerView最可怜的界别在数据源改变时的缓存的拍卖逻辑,ListView是”一锅端”,将有所的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是进一步灵活地指向每个View修改标志位,区分是否重新bindView。

2.2 局部刷新

是因为上文可知,RecyclerView的缓存机制真正更完善,但还无算质的成形,RecyclerView更怪的优点在于提供了有刷新的接口,通过一些刷新,就可知免调用许多没用的bindView。

公海赌船网址 17

(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()流程图:

公海赌船网址 18

公海赌船网址 19

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

公海赌船网址 20

当调用fill()中RecyclerView.getViewForPosition(pos)时,RecyclerView通过对pos和flag的优先处理,使得bindview只调用相同不好.

亟需指出,ListView和RecyclerView最丰盛之分在于数据源改变时的缓存的处理逻辑,ListView是”一锅端”,将有的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是更灵敏地指向每个View修改标志位,区分是否重新bindView。

三.结论

1、在有的观下,如界面初步化,滑动等,ListView和RecyclerView都可以至极好地劳作,两者并没特别卓殊之别:

作品的启幕就丢掉来了如此一个问题,微信Android客户端卡券模块,大部分UI都是为列表页的格局显得,实现情势吧ListView,是否来必不可元帅这一个替换成RecyclerView呢?

公海赌船网址 21

答案是否定的,从性质达到看,RecyclerView并不曾带来彰着的擢升,不待频繁更新,暂不帮忙用动画,意味着RecyclerView优势也非太显眼,没有最好可怜之吸引力,ListView已经能怪好地满足工作需求。

2、数据源频繁更新的情况,如弹幕:http://www.jianshu.com/p/2232a63442d6 等RecyclerView的优势会这么些引人注目;

进而来讲,结论是:
列表页展示界面,需要襄助动画,或者反复更新,局部刷新,提议下RecyclerView,更加有力到,易扩充;其余情状(如微信卡包列表页)两者都OK,但ListView在利用上会师愈方便,快速。

三.结论

1、在有的面貌下,如界面起先化,滑动等,ListView和RecyclerView都能怪好地工作,两者并从未好非凡之异样:

作品的起就丢掉来了如此一个题材,微信Android客户端卡券模块,大部分UI都是因列表页的样式显得,实现格局吗ListView,是否生必不可少校那一个替换成RecyclerView呢?

公海赌船网址 22

答案是否定的,从性质上看,RecyclerView并无拉动显明的提升,不待反复更新,暂不匡助用动画,意味着RecyclerView优势也非太明确,没有太可怜之吸重力,ListView已经能生好地满意工作需求。

2、数据源频繁更新的现象,如弹幕:http://www.jianshu.com/p/2232a63442d6 等RecyclerView的优势会分外了解;

进而来讲,结论是:
排表页体现界面,需要辅助动画,或者反复更新,局部刷新,提议下RecyclerView,更加强劲到,易扩大;此外情形(如微信卡包列表页)两者都OK,但ListView在使用及会愈发有利于,快速。

相关文章