RecyclerView与ListView的区别

一、布局效果对比

1,ListView的布局效果比较单一,只有一个纵向效果。

2,RecyclerView的布局较为丰富,可以在LayoutManager中设置线性布局(纵向,横向),表格布局,瀑布流布局。

3,在RecyclerView中,如果存在的LayoutManager不能满足需求,可以在LayoutManager的API中自定义Layout,例如,scrollToPosition(),setOrientation(),findViewByPosition()等等。

二、 ListView与RecyclerView的简单使用

ListView

1,继承重写BaseAdapter类;

2,自定义ViewHolder和ConvertView的优化(判断是否为null);

RecylcerView

1,继承重写RecyclerView.Adapter与RecyclerView.ViewHolder

2,设置LayoutManager,以及layout的布局效果

区别:

1,ViewHolder的编写规范化,ListView是需要自己定义的,RecyclerView是规范好的。

2,RecyclerView复用item,不需要像ListView那样setTag()与getTag()

3,RecyclerView多了些LayoutManager工作,但实现了布局效果多样化

三、空数据处理方式

在ListView中有一个setEmptyView()用来处理Adapter中数据为空的情况,但是RecyclerView中没有这个API,所以在RecyclerView中需要进行一些数据判断来实现数据为空的情况。

四、局部刷新

1,在ListView中通常刷新数据是用notifyDataSetChanged(),这种刷新数据是全局刷新,每个item都会重新加载一遍,这样就会非常消耗资源。

2,RecyclerView中可以实现局部刷新,notifyItemChanged()。

3,如果想要ListView实现了局部刷新,依然是可以实现的,当item数据刷新时,我们可以在Adapter中,实现一个onItemChanged()方法,在方法里面获取到这个item的position(通过getFirstVisiblePosition()),然后调用getView()方法来刷新这个item的数据。

五、动画效果

1,在RecyclerView中,已经封装好API来实现自己的动画效果,例如,notifyItemChanged(),notifyItemMoved()等等。

2,ListView中并没有实现动画效果,但是我们可以在Adapter中自己实现Item的动画效果。

六、item点击事件

在ListView中有onItemClickListener, onItemLongClickListener , onItemSelectedListener ,但是在添加HeaderView与FooterView后就不一样了,因为 HeaderView 与 FooterView 都会算进position中,这时会发现position会出现变化,可能会抛出数组越界,为了解决这个问题,我们在getItem方法中(在该方法中HeaderView与FooterView返回的值是-1)通过返回id来标志对应的item,而不是通过position来标记。我们可以在Adapter中针对每个item写在getView中比较合适。

2,在RecyclerView中,提供了唯一一个API,addOnItemTouchListener,监听item事件。

七、嵌套滚动机制

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

2,ListView就没有嵌套滚动机制。

八、缓存机制不同

这里可以参考《Android ListView 与 RecyclerView 对比浅析—缓存机制》