RecyclerView和ListView的区别

文章脑图

RecyclerView和ListView的区别_第1张图片
文章内容

1、主要区别

  • 布局效果
  • 空数据处理
  • 头尾布局
  • 局部刷新
  • 动画效果
  • item点击事件
  • 缓存机制
  • 在Android L引入嵌套滚动机制(NestedScrolling)
  • 性能

2、布局效果

  1. ListView布局比较单一,只有一个纵向效果
  2. RecyclerView布局效果丰富, 可以在LayoutMananger中设置:LinearLayoutManager线性布局(纵向,横向),GridLayoutManager表格布局,StaggeredGridLayoutManager瀑布流布局
  3. 在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、空数据处理

  1. ListView中有个setEmptyView用来处理数据为空的情况,而RecyclerView需要根据数据判断处理空数据情况

4、头尾布局

  1. ListView自带addHeaderView和addFooterView来添加头部底部item来实现,并不影响Adapter的编写
  2. RecyclerView需要借助Adapter实现头尾布局,通过设置ViewHolder不同的类型实现

5、局部刷新

  1. ListView刷新数据用notifyDataSetChanged()刷新所有数据 ,开销比较大
  2. 而RecyclerView可以调用notifyItemChanged实现局部刷新
  3. 当然,两者都可以通过position找到对应item的布局,然后刷新对应子布局,从而实现局部刷新

6、动画效果

  1. RecyclerView自带动画效果,如果需要自定义动画可通过自定义RecyclerView.ItemAnimator类,然后调用setItemAnimator设置
  2. ListView没有动画效果的实现,但可以对单个item添加动画实现动画效果,相对比较麻烦

7、item点击事件

  1. ListView自带onItemClickListener(), onItemLongClickListener(), onItemSelectedListener()点击事件
  2. RecyclerView提供唯一一个addOnItemTouchListener监听item的触摸事件,通过addOnItemTouchListener加上Gesture Detector来实现item点击事件

8、缓存机制

ListView与RecyclerView缓存机制原理大致相似,滑动过程中,离开屏幕的ItemView即被回收池缓存,进入屏幕的ItemView则会优先从缓存中获取

  1. 缓存层级不同

RecyclerView(四层)比ListView(两层)多两级缓存,支持多个ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有RecyclerView共用同一个RecyclerViewPool(缓存池),ListView和RecyclerView缓存机制基本一致

  1. 缓存内容不同

1、RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为:View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态)
2、ListView缓存View

  1. 获取缓存流程不同

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、嵌套滚动机制

  1. 在事件分发机制中,Touch事件在进行分发的时候,由父View向子View传递,一旦子View消费这个事件的话,那么接下来的事件分发的时候,父View将不接受,由子View进行处理;但是与Android的事件分发机制不同,嵌套滚动机制(Nested Scrolling)可以弥补这个不足,能让子View与父View同时处理这个Touch事件,主要实现在于NestedScrollingChild与NestedScrollingParent这两个接口;而在RecyclerView中,实现的是NestedScrollingChild,所以能实现嵌套滚动机制;
  2. ListView就没有实现嵌套滚动机制

10、性能

  1. 频繁的刷新数据,需要添加动画,则RecyclerView有较大的优势
  2. 如果只是作为列表展示,则两者区别并不是很大

你可能感兴趣的:(RecyclerView和ListView的区别)