recyclerview

时间:2024-10-03 06:22:12编辑:分享君

recyclerview和listview的区别?

亲,您好,recyclerview和listview的区别具体如下哦:1. 数据源不同:ListView使用Adapter作为数据源,而RecyclerView使用Adapter和LayoutManager分别处理数据和布局。2. 复用机制不同:RecyclerView通过ViewHolder复用Item View,减少了内存开销和渲染时间。3. 布局灵活性不同:RecyclerView支持多种布局方式,包括横向、纵向、网格等,而ListView只支持纵向布局。4. 动画支持不同:RecyclerView支持Item动画,可以为列表添加不同的动画效果,而ListView则不支持。5. 缓存策略不同:RecyclerView可以根据滑动方向预加载Item,提高了列表的滑动流畅度。因此,RecyclerView相对于ListView来说,具有更加灵活的布局方式、更好的性能和更好的用户体验。同时,RecyclerView也更加适合处理大量数据的列表。【摘要】
recyclerview和listview的区别?【提问】
亲,您好,recyclerview和listview的区别具体如下哦:1. 数据源不同:ListView使用Adapter作为数据源,而RecyclerView使用Adapter和LayoutManager分别处理数据和布局。2. 复用机制不同:RecyclerView通过ViewHolder复用Item View,减少了内存开销和渲染时间。3. 布局灵活性不同:RecyclerView支持多种布局方式,包括横向、纵向、网格等,而ListView只支持纵向布局。4. 动画支持不同:RecyclerView支持Item动画,可以为列表添加不同的动画效果,而ListView则不支持。5. 缓存策略不同:RecyclerView可以根据滑动方向预加载Item,提高了列表的滑动流畅度。因此,RecyclerView相对于ListView来说,具有更加灵活的布局方式、更好的性能和更好的用户体验。同时,RecyclerView也更加适合处理大量数据的列表。【回答】


RecyclerView和ListView的区别

一、 缓存机制对比

1. 层级不同:

RecyclerView比ListView多两级缓存,支持多个离ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有RecyclerView共用同一个RecyclerViewPool(缓存池)。

具体来说:

ListView(两级缓存):

RecyclerView(四级缓存):

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的缓存机制做了补强和完善。

2. 缓存不同:

1). RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为:

View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态);

RecyclerView中mCacheViews(屏幕外)获取缓存时,是通过匹配pos获取目标位置的缓存,这样做的好处是,当数据源数据不变的情况下,无须重新bindView:

2). ListView缓存View。而同样是离屏缓存,ListView从mScrapViews根据pos获取相应的缓存,但是并没有直接使用,而是重新getView(即必定会重新bindView)。

二、 局部刷新

RecyclerView更大的亮点在于提供了局部刷新的接口,通过局部刷新,就能避免调用许多无用的bindView。ListView和RecyclerView最大的区别在于数据源改变时的缓存的处理逻辑,ListView是"一锅端",将所有的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是更加灵活地对每个View修改标志位,区分是否重新bindView。

ListView获取缓存的流程:

RecyclerView获取缓存的流程:

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

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

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


上一篇:百变大咖秀20120920

下一篇:没有了