RecyclerView和ListView区别

219 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

RecyclerView和ListView都是将大量数据以item的形式展示出来的控件,RecyclerView则是在ListView的基础上进行改进加强,那么Recyclerview在ListView的基础上改进了哪些东西呢?两者又有什么区别?

1. 布局方式

  • ListView
    • 只有竖直排列一种排列方式
  • RecyclerView
    • 支持线性布局,网格布局和瀑布流布局

2. 刷新机制

  • ListView
    • 刷新数据是调用notifyDataSetChanged()
    • 该刷新方式是将所有Item的数据都刷新一遍,会消耗过多的资源,在需要频繁刷新数据的场景下对系统的负担就太大了,RecyclerView就解决了这个问题。
  • RecyclerView
    • 可以通过notifyItemChanged(int position)传入Item位置来局部刷新数据
    • 该刷新方式弥补了ListView刷新数据时过多消耗资源的缺点

3. 动画效果

  • ListView
    • 没有实现动画效果,可以自己在Adapter里实现Item的动画效果
  • RecyclerView
    • RecyclerView可以调用setItemAnimator(@Nullable ItemAnimator animator)实现动画效果

4. Item点击事件

  • ListView
    • 可以通过setOnItemClickListener(@Nullable OnItemClickListener listener)设置Item点击事件
  • RecyclerView
    • 本身没有支持监听Item点击的事件,只能通过回调接口来设置点击事件

5. 嵌套滚动机制

  • ListView
    • 没有实现嵌套滚动机制
  • RecyclerView
    • 可以通过NestedScrollingChildNestedScrollingParent这两个接口实现嵌套滚动机制,在控件被Touch的时候,能保证父View与子View都能够同时处理该事件
    • 父View负责实现NestedScrollingParent,子View负责实现NestedScrollingChild

6. 空数据处理

  • ListView
    • 存在setEmptyView(View emptyView)方法设置当Adapter数据为空时所显示的View
  • RecyclerView
    • 没有解决空数据情况的方法,只能在Adapter中自行判断数据为空的情况

7. 添加头布局和尾布局

  • ListView
    • 可以通过addHeaderView(View v)addFooterView(View v)在列表的头部和尾部添加自定义View,当多次调用添加头尾布局方法时,会根据调用顺序依次添加View
    • 在酷安的快讯页面可以看到类似的ListView添加头布局的设计
  • RecyclerView
    • 添加头尾布局则需要我们自己在Adapter中自行编写,利用ViewHolder的Type来判断当前Item的View,可以完全自定义列表中每个Item的布局
    • 在bilibili的推荐页面可以看到广告就用类似在RecyclerView中 插入不同ItemView的设计

8. 缓存机制(重)

缓存机制会另外开一个章节介绍


如有错误,欢迎评论区批评指正!