在Android开发最火热的时候ListView是最长使用的一种展示多item的控件,而在2018年的现在已经很少有人用ListView了,使用最多当数RecyclerView了。
下面总结一下两者的区别:
- 两者的用法区别
- 布局效果
- 对空数据的处理
- HeaderView与FooterView
- 局部刷新
- 动画效果
- Item的点击事件
- 嵌套滚动机制
1、ListView与RecyclerView的用法区别
1)LisView的适配器需要继承BaseAdapter类;而RecyclerView的适配器继承自RecyclerView.Adapter
2)ListView需要自定义ViewHolder,与自定义ViewHolder、converView的优化(判断是否为null);
而RecyclerView只需要继承RecycelerView.ViewHolder,它的holder类是封装好的
3)子item的复用,ListView需要setTag()和getTag();而RecyclerView则不需要
4)RecyclerView需要做LayoutManager工作,并且实现了布局效果多样化
2、布局效果的区别
1)ListView的布局比较单一,只有纵向效果;而RecyclerView的布局效果较多,在LayoutManager中可以设置常见的线性布局(横向、纵向),表格布局,瀑布流布局
2)RecyclerView可以在LayoutManager中自定义Layout,如scrollToPosition(),setOrientation(),findViewByPosition()等
3、空数据处理
- ListView中可以设置空数据,调用setEmptyView()方法处理数据为空的情况;而RecyclerView没有对应的方法,需要自己判断数据是否为空
4、HeaderView与FooterView
- ListView中可以设置addHeaderView()和addFooterView()来添加头部item和底部item,实现下拉刷新和上拉加载的情况;而RecyclerView中没有这两个方法,如果需要可以在Adapter中自己定义。
5、局部刷新
- ListView中数据刷新通常使用notifyDataSetChanged(),但是这种属于全局刷新(每个item都要重新加载一遍);RecyclerView可以实现局部刷新,如notifyItemChanged()
- ListView 也可以实现局部item刷新,当一个item刷新时,在Adapter中,实现一个onItemChanged()方法,在方法里面获取这个item的position,然后调用getView方法来刷新这个item的数据。
6、动画效果
- 在RecyclerView中,已经封装好API来实现自己的动画效果;有许多动画API,例如:notifyItemChanged(), notifyDataInserted(), notifyItemMoved()等等;如果我们需要淑贤自己的动画效果,我们可以通过相应的接口实现自定义的动画效果(RecyclerView.ItemAnimator类),然后调用RecyclerView.setItemAnimator() (默认的有SimpleItemAnimator与DefaultItemAnimator);
- 但是ListView并没有实现动画效果,但我们可以在Adapter自己实现item的动画效果;
7、嵌套滚动
- 在事件分发机制中,Touch事件在进行分发的时候,由父View向子View传递,一旦子View消费这个事件的话,那么接下来的事件分发的时候,父View将不接受,由子View进行处理;但是与Android的事件分发机制不同,嵌套滚动机制(Nested Scrolling)可以弥补这个不足,能让子View与父View同时处理这个Touch事件,主要实现在于NestedScrollingChild与NestedScrollingParent这两个接口;而在RecyclerView中,实现的是NestedScrollingChild,所以能实现嵌套滚动机制;
- ListView就没有实现嵌套滚动机制;