listview 和RecycleView区别

RecyclerView和ListView之间的区别


在我们要搞清楚一个问题之前,首先要搞清楚为什么,是什么,

最后才能得出结论



一:为什么会出现recycleView

RecyclerView并不会完全替代ListView(这点从ListView没有被标记为@Deprecated可以看出),两者的使用场景不一样。但是RecyclerView的出现会让很多开源项目被废弃,例如横向滚动的ListView, 横向滚动的GridView, 瀑布流控件,因为RecyclerView能够实现所有这些功能。比如有一个需求是屏幕竖着的时候的显示形式是ListView,屏幕横着的时候的显示形式是2列的GridView,此时如果用RecyclerView,则通过设置LayoutManager一行代码实现替换。

ListView vs RecyclerView,ListView相比RecyclerView,有一些

优点:

addHeaderView(), addFooterView()添加头视图和尾视图。通过”android:divider”设置自定义分割线。setOnItemClickListener()和setOnItemLongClickListener()设置点击事件和长按事件。这些功能在RecyclerView中都没有直接的接口,要自己实现(虽然实现起来很简单),因此如果只是实现简单的显示功能,ListView无疑更简单。RecyclerView相比ListView,有一些明显的优点:默认已经实现了View的复用,不需要类似if(convertView == null)的实现,而且回收机制更加完善。默认支持局部刷新。容易实现添加item、删除item的动画效果。容易实现拖拽、侧滑删除等功能。RecyclerView是一个插件式的实现,对各个功能进行解耦,从而扩展性比较好。RecyclerView是Android 5.0提出的新UI控件,可以用来代替传统的ListView

ListView实现局部刷新

我们都知道ListView通过adapter.notifyDataSetChanged()实现ListView的更新,这种更新方法的缺点是全局更新,即对每个Item View都进行重绘。但事实上很多时候,我们只是更新了其中一个Item的数据,其他Item其实可以不需要重绘。

我们通过ListView的getChildAt()来获得需要更新的View,然后通过getTag()获得ViewHolder,从而实现更新。

RecyclerView的标准实现步骤如下:

  • 创建Adapter:创建一个继承RecyclerView.Adapter<VH>的Adapter类(VH是ViewHolder的类名),记为NormalAdapter。

  • 创建ViewHolder:在NormalAdapter中创建一个继承RecyclerView.ViewHolder的静态内部类,记为VH。ViewHolder的实现和ListView的ViewHolder实现几乎一样。

  • 在NormalAdapter中实现:

    • VH onCreateViewHolder(ViewGroup parent, int viewType): 映射Item Layout Id,创建VH并返回。

    • void onBindViewHolder(VH holder, int position): 为holder设置指定数据。

    • int getItemCount(): 返回Item的个数。

可以看出,RecyclerView将ListView中getView()的功能拆分成了onCreateViewHolder()onBindViewHolder()

ListView只提供了 notifyDataSetChanged() 更新整个视图,这是很不合理的。RecyclerView提供了 notifyItemInserted() , notifyItemRemoved() , notifyItemChanged() 等API更新单个或某个范围的Item视图

1.查看持有人

在ListView中,定义视图持有者是保持视图引用的建议方法。但这不是强制。虽然通过不这样做,ListView使用显示陈旧的数据。不使用视图持有者的另一个主要缺点可能导致每次都通过id查找视图的繁重操作。这导致了ListView的滞后。

RecylerView通过使用RecyclerView.ViewHolder解决了这个问题类。这是RecyclerView和ListView中的主要区别之一。实现RecyclerView时,此类用于定义适配器用来将ViewHolder与位置绑定的ViewHolder对象。另外需要指出的是,在实现RecyclerView适配器的同时,提供ViewHolder是强制性的。这使得实现有点复杂,但解决了ListView面临的问题。

2.布局管理器

当谈到ListView时,只有一种类型的ListView可用,即垂直ListView。您不能使用水平滚动来实现ListView。我知道有些方法可以实现水平滚动,但相信我并不是按照这种方式工作的。

但是现在,当我们看看Android RecyclerView vs ListView时,我们也支持横向集合。事实上它支持多种类型的列表。为了支持多种类型的列表,它使用RecyclerView.LayoutManager类。这是ListView没有的新东西。RecyclerView支持三种预定义布局管理器:

  • LinearLayoutManager - 这是RecyclerView中最常用的布局管理器。通过这个,我们可以创建水平和垂直滚动列表。
  • StaggeredGridLayoutManager - 通过这个布局管理器,我们可以创建交错列表。就像Pinterest屏幕一样。
  • GridLayoutManager - 这个布局管理器可以用来显示网格,就像任何图片库一样。

3.Item动画

列表中的动画是一个全新的维度,具有无限的可能性。在ListView中,因此没有特殊的规定,通过它可以动画,添加或删除项目。而后来随着android演变而来的ViewPropertyAnimator是由Google的Chet Haase在本视频教程中提出的 用于ListView中的动画。

另一方面,比较Android RecyclerView vs ListView,它有RecyclerView.ItemAnimator用于处理动画的类。通过这个类,可以为项目添加,删除和移动事件定义自定义动画。它还提供了一个DefaultItemAnimator,以防你不需要任何定制。


4.适配器

ListView适配器很容易实现。他们有一个主要方法getView曾经发生过的所有魔法。那些观点被绑定到一个位置。他们也曾经有一个有趣的方法  registerDataSetObserver在哪里可以在适配器中设置观察者。此功能也存在于RecyclerView中,但RecyclerView.AdapterDataObserver中类用于它。但赞成ListView的观点是它支持三种适配器的默认实现:

而RecyclerView适配器具有ListView适配器除了支持DB游标和ArrayLists之外的所有功能。RecyclerView.Adapter中截至目前,我们必须制定一个自定义实现来向适配器提供数据。就像BaseAdapter一样为ListViews做。虽然如果您想了解更多关于RecyclerView适配器实现的


5.分隔符

要在ListView中显示自定义分隔符,可以在ListView XML中轻松添加这些参数:

关于Android RecyclerView的一个有趣的部分是,截至目前它默认情况下不显示项目之间的分隔符。尽管谷歌的这些人一定是故意为此定制化的。但这大大增加了开发人员的工作量。如果您希望在项目之间添加分隔线,则可能需要使用RecyclerView.ItemDecoration 类


6. OnItemTouchListener

Listviews用于检测点击的简单实现,即通过使用AdapterView.OnItemClickListener 接口。

但另一方面,RecyclerView.OnItemTouchListener界面用于检测Android RecyclerView中的触摸事件。它使实现变得复杂一点,但它为开发人员拦截触摸事件提供了更大的控制。官方文档指出,它可以用于手势操作,因为它在交付给RecyclerView之前拦截触摸事件


7.结论

我想结束这个Android RecyclerView vs ListView比较,说RecyclerView被填充将会有很多可定制的功能。它对于实现复杂的列表或网格非常有用。但是与ListView相比,它有点难以实现,因为它包含需要实现的多个类,列表页展示界面,需要支持动画,或者频繁更新,局部刷新,建议使用RecyclerView,更加强大完善,易扩展;其它情况(如微信卡包列表页)两者都OK,但ListView在使用上会更加方便,快捷




猜你喜欢

转载自blog.csdn.net/qq_18757557/article/details/80433742