RecyclerView和ListView的区别

RecyclerView和ListView的区别

基础使用

ListView的适配器最终是继承BaseAdapter类重写方法,自定义ViewHolder和ConvertView一起完成复用优化工作。RecyclerView 同样也是需要继承重写 RecyclerView.Adapter 和 强制使用RecyclerView.ViewHolder ,以及使用到了LayoutManager。

所以这样看来,在RecyclerView当中与ListView不同之处在于:

  • 对ViewHolder的编写进行了规范化。
  • 另外,RecyclerView对 Item的复用 ,关于使用到ViewHolder对控件实例进行缓存的工作已经封装好,不需要像 ListView 那样调用 setTag 。
  • 但是 RecyclerView 多出了 LayoutManager 的设置工作 。

布局效果

  • ListView 做到了数据和视图的分离,布局排列是自身去管理。
  • 而RecycleView 将视图和布局进一步分离, 因而出现了 LayoutManager,RecycleView 只负责管理视图的重复利用,然后将布局的管理全权交给了 LayoutManager, 不像 ListView 那样被限制在垂直滚动布局样式 。LayoutManager中制定了一套可扩展的布局排列接口,子类只要按照接口规范来实现,就能定制出各种不同排列方式的布局了。 LayoutManager 是一个抽象类,系统已经为我们提供了三个相关的实现类 LinearLayoutManager(线性布局效果)GridLayoutManager(网格布局效果)StaggeredGridLayoutManager(瀑布流布局效果)。 RecyclerView 默认就能支持 线性布局网格布局瀑布流布局 三种 ,通过配置和切换 LayoutManager 就可以获得不同的布局效果。所以如果想自定义出更多布局效果,可以继承重写自己的LayoutManager,通过LayoutManager还可以设置滚动方向、获取Item的位置等等。

事件监听

  • ListView中提供了setOnItemClickListener、 setOnItemLongClickListener、setOnItemSelectedListener 等几个用于设置监听器,但是这些只能注册的是子项的点击事件,具体到子项里面的某个控件的点击事件的处理会比较麻烦,而且添加了 HeaderView 和 FooterView ,ListView 会把 HeaderView 和 FooterView 算入 position 内,代码有可能会报数组越界的错误 。
  • 但是RecyclerView ,它并没有像 ListView 提供太多关于 Item 的某种事件监听,需要我们自己通过ViewHolder去给子项具体的View去注册点击事件,或者就是通过 addOnItemTouchListener 和GestureDetector手势判断来实现

空数据的处理

  • ListView 提供了 setEmptyView 这个 API 来让我们处理 Adapter 中数据为空的情况。
  • 但是 RecyclerView 并没有提供这类 API ,所以需要自己处理。

HeaderView 和 FooterView

  • 在 ListView 的设计中,addFooterView 、 addFooterView 可以添加HeaderView 和 FooterView 两种类型的视图 。
  • RecyclerView 并没有提供这类 API。

局部刷新

  • 更新了 ListView 的数据源后需要通过 Adapter 的 notifyDataSetChanged 方法来通知视图更新变化,调用简单,但它会重绘每个 Item,实际上却并不是每个 Item 都需要重绘。

  • 而RecyclerView.Adapter 提供了 notifyItemChanged 用于更新单个 Item View 的刷新,我们可以省去自己写局部更新的工作。

动画效果

RecycleView 支持子项目层次的动画效果,是通过 ItemAnimation 接口(确定一下)实现的, 可以在 Adapter 中的数据发生变化的时候,通过调用 Adapter 的相关方法激活动画的产生,就是RecyclerView 在做局部刷新等等的时候有一个渐变的动画效果 。

嵌套滚动机制

掘金

猜你喜欢

转载自www.cnblogs.com/chen-ying/p/12386712.html