RecyclerView 和 ListView对比
布局效果对比布局效果对比RecyclerView默认支持线性布局,网格布局,瀑布流布局,同时支持横向,纵向滚动。APIListView继承重写BaseAdapter类自定义ViewHolder和convertView一起完成复用工作RecyclerView继承重写RecyclerView.Adapter和RecyclerView.ViewHolder设置布局管理器,设置布局效果区别ViewHodl
布局效果对比布局效果对比
RecyclerView默认支持线性布局,网格布局,瀑布流布局,同时支持横向,纵向滚动。
API
ListView
- 继承重写BaseAdapter类
- 自定义ViewHolder和convertView一起完成复用工作
RecyclerView
- 继承重写RecyclerView.Adapter和RecyclerView.ViewHolder
- 设置布局管理器,设置布局效果
区别
- ViewHodler编写规范化
- RecyclerView复用item的工作封装好了,不需要Listview调用setTag
- RecyclerView多了一步LayoutManager的设置工作
LayoutManager
LayoutManager
只是一个抽象类而已,系统已经为我们提供了三个相关的实现类 LinearLayoutManager
(线性布局效果)、GridLayoutManager
(网格布局效果)、StaggeredGridLayoutManager
(瀑布流布局效果)
空数据处理
ListView 提供了 setEmptyView 这个 API 来让我们处理 Adapter 中数据为空的情况
HeaderView 和 FooterView
ListView提供,RecyclerView不提供
局部刷新
ListView只提供了notifyDataSetChanged()所有item都需要重绘。
RecyclerView提供notifyItemChanged(int position)可以跟新局部item
动画效果
listViewAnimations通过装饰者模式扩充adapter,结合属性动画animator添加动画效果
RecyclerView提供了很多基础动画(增删移改)api,或集成RecyclerView.Animator实现自己动画,并通过setItemAnimator()设置
监听item事件
Listview提供3个setOnItemClickListener,把头部局和脚布局都版含在内了,计算麻烦
RecyclerView提供1个addOnItemTouchListener
嵌套滚动机制
- Android触摸事件分发机制,touch事件在分发处理时,由父view分发给子view,一旦子view处理了,父view将不再处理touh事件
- 嵌套滚动机制为了让子view和父view同时处理一个touch事件.RecyclerView实现NestedScrollingChild
ListView 并不支持嵌套滚动机制
缓存不同:
一、 缓存机制对比
- 层级不同:
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的缓存机制做了补强和完善。
- 缓存不同:
1). RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为:
View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态);
RecyclerView中mCacheViews(屏幕外)获取缓存时,是通过匹配pos获取目标位置的缓存,这样做的好处是,当数据源数据不变的情况下,无须重新bindView:
2). ListView缓存View。而同样是离屏缓存,ListView从mScrapViews根据pos获取相应的缓存,但是并没有直接使用,而是重新getView(即必定会重新bindView)。
更多推荐
所有评论(0)