文章脑图
文章内容1、主要区别
- 布局效果
- 空数据处理
- 头尾布局
- 局部刷新
- 动画效果
- item点击事件
- 缓存机制
- 在Android L引入嵌套滚动机制(NestedScrolling)
- 性能
2、布局效果
- ListView布局比较单一,只有一个纵向效果
- RecyclerView布局效果丰富, 可以在LayoutMananger中设置:LinearLayoutManager线性布局(纵向,横向),GridLayoutManager表格布局,StaggeredGridLayoutManager瀑布流布局
- 在RecyclerView中,可以用LayoutManager自定义效果:
canScrollHorizontally();//能否横向滚动
canScrollVertically();//能否纵向滚动
scrollToPosition(int position);//滚动到指定位置
setOrientation(int orientation);//设置滚动的方向
getOrientation();//获取滚动方向
findViewByPosition(int position);//获取指定位置的Item View
findFirstCompletelyVisibleItemPosition();//获取第一个完全可见的Item位置
findFirstVisibleItemPosition();//获取第一个可见Item的位置
findLastCompletelyVisibleItemPosition();//获取最后一个完全可见的Item位置
findLastVisibleItemPosition();//获取最后一个可见Item的位置
3、空数据处理
- ListView中有个setEmptyView用来处理数据为空的情况,而RecyclerView需要根据数据判断处理空数据情况
4、头尾布局
- ListView自带addHeaderView和addFooterView来添加头部底部item来实现,并不影响Adapter的编写
- RecyclerView需要借助Adapter实现头尾布局,通过设置ViewHolder不同的类型实现
5、局部刷新
- ListView刷新数据用notifyDataSetChanged()刷新所有数据 ,开销比较大
- 而RecyclerView可以调用notifyItemChanged实现局部刷新
- 当然,两者都可以通过position找到对应item的布局,然后刷新对应子布局,从而实现局部刷新
6、动画效果
- RecyclerView自带动画效果,如果需要自定义动画可通过自定义RecyclerView.ItemAnimator类,然后调用setItemAnimator设置
- ListView没有动画效果的实现,但可以对单个item添加动画实现动画效果,相对比较麻烦
7、item点击事件
- ListView自带onItemClickListener(), onItemLongClickListener(), onItemSelectedListener()点击事件
- RecyclerView提供唯一一个addOnItemTouchListener监听item的触摸事件,通过addOnItemTouchListener加上Gesture Detector来实现item点击事件
8、缓存机制
ListView与RecyclerView缓存机制原理大致相似,滑动过程中,离开屏幕的ItemView即被回收池缓存,进入屏幕的ItemView则会优先从缓存中获取
- 缓存层级不同
RecyclerView(四层)比ListView(两层)多两级缓存,支持多个ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有RecyclerView共用同一个RecyclerViewPool(缓存池),ListView和RecyclerView缓存机制基本一致
- 缓存内容不同
1、RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为:View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态)
2、ListView缓存View
- 获取缓存流程不同
1、 RecyclerView中mCacheViews(屏幕外)获取缓存时,是通过匹配pos获取目标位置的缓存,这样做的好处是,当数据源数据不变的情况下,无需重新bindView。而同样是离屏缓存,ListView从mScrapViews根据pos获取相应的缓存,但是并没有直接使用,而是重新getView(即必定会重新bindView)
2、ListView中通过pos获取的是view,即pos->view;RecyclerView中通过pos获取的是viewholder,即pos -> (view,viewHolder,flag);从流程图中可以看出,标志flag的作用是判断view是否需要重新bindView,这也是RecyclerView实现局部刷新的一个核心
9、嵌套滚动机制
- 在事件分发机制中,Touch事件在进行分发的时候,由父View向子View传递,一旦子View消费这个事件的话,那么接下来的事件分发的时候,父View将不接受,由子View进行处理;但是与Android的事件分发机制不同,嵌套滚动机制(Nested Scrolling)可以弥补这个不足,能让子View与父View同时处理这个Touch事件,主要实现在于NestedScrollingChild与NestedScrollingParent这两个接口;而在RecyclerView中,实现的是NestedScrollingChild,所以能实现嵌套滚动机制;
- ListView就没有实现嵌套滚动机制
10、性能
- 频繁的刷新数据,需要添加动画,则RecyclerView有较大的优势
- 如果只是作为列表展示,则两者区别并不是很大
网友评论