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的观点是它支持三种适配器的默认实现:

  • ArrayAdapter
  • CursorAdapter
  • SimpleCursorAdapter

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

5.分隔符

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

XHTML
1
2

android:divider="@android:color/transparent"
android:dividerHeight="5dp"

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

6. OnItemTouchListener

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

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

7.结论

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

listview 和RecycleView区别相关推荐

  1. ListView和RecycleView的性能比对

    ListView相比RecyclerView,有一些优点: addHeaderView(), addFooterView()添加头视图和尾视图. 通过"android:divider&quo ...

  2. Android截屏截图方法汇总(Activity、View、ScrollView、ListView、RecycleView、WebView截屏截图)

    Android截屏 Android截屏的原理:获取具体需要截屏的区域的Bitmap,然后绘制在画布上,保存为图片后进行分享或者其它用途 一.Activity截屏 1.截Activity界面(包含空白的 ...

  3. 记录一下面试考题一(组件化,ListView和RecyleView区别,App启动,Binder)

    1,组件化和ARouter原理 组件化定义:由若干独立的子模块,组合成一个整体,降低模块间的耦合,这些子模块在补足一定的条件下,都可独立运行.主模块也不会因为缺少任意子模块而无法运行.组件之间可以灵活 ...

  4. Android知识大纲

    Android知识大纲 Java垃圾回收机制 Java内存是如何划分的,Java语言为什么要使用垃圾回收机制? 垃圾判定 1. 标记引用算法 2. 根搜索法 虚拟机栈中的引用对象 方法区中的常量引用对 ...

  5. DataBinding使用指南(一)DataBinding基本使用,双向绑定,ListView RecycleView使用

    databing使用指南 简介 简单使用 双向绑定 ListView.RecycleView中的使用 . ListView ListView 中数据的简单展示 数据源改变后数据更新方式 . Recyc ...

  6. 【Android】RecycleView简单仿漫画APP图片相关样式

    真的真的想不到起什么标题好了,这次的内容真的是太简单了,没有什么挑战性,一天以内就完成了.最近在学kotlin,也会有一份kotlin的代码,鉴于很多人都是从java开始进行android开发的,ko ...

  7. kotlin和java区别!Android平台HTTPS抓包解决方案及问题分析,大厂面试题汇总

    缘起 随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑.快速迭代的目的越来越难,还有65535,应用之间的互相调用等等问题,插件化技术应用而生.如果没有插件化 ...

  8. TemplateView , ListView ,DetailView三种常用类视图用法

    有函数类图,还需要类视图??当然,类视图方便,好用,不信你感受感受.... TemplateView get_queryset(self)#默认取出该表所有数据.想要过滤自定义只能在get_query ...

  9. RecycleView和ViewPager冲突解决与原理

    1.概述 在实际开发中,我们经常遇到需要在ListView或RecycleView头部添加ViewPager实现Banner轮播效果,并需要添加下拉刷新,上拉加载功能. 但,横向滑动ViewPager ...

最新文章

  1. Java学习总结:30
  2. 【重要】如何彻底夯实CV基础,有三AI三大导师一起带你学习!
  3. UVA - 11491 Erasing and Winning(奖品的价值)(贪心)
  4. [转]总结:Apache/Tomcat/JBOSS/Jetty/Nginx区别 .
  5. 阿里巴巴右侧6滑块VS雅虎右侧6滑块VS自定义6滑块
  6. 深度隐式表达系列 (一)
  7. Linux运维需要掌握的技能 (转)
  8. ubuntu下安装tun模块图文详细教程
  9. APN(default、mms、supl、dun、hipri接入点类型的区别)
  10. Python 保留字和关键字的用法
  11. 百度杯”CTF比赛(十二月场)
  12. php 499,nginx 499 状态码优化
  13. redis主从完整配置说明
  14. 智能化的Conversational UI是移动发展的一个趋势
  15. pdf编辑器工具哪个好?好用的pdf编辑器一款就够!
  16. 办理十环认证费用要多少钱?
  17. 华为机试:身高体重排序(仅有题,待求解)
  18. 高考倒计时1天 | 百度数字人“考生”度晓晓将挑战高考作文
  19. iOS及Mac开源资料
  20. FusionCharts基本使用

热门文章

  1. NavCat15安装教程
  2. 17-upstream指令参数
  3. 不管你学的是什么专业,你都应该多少懂些管理学的东西-----【管理学十大经典定理}...
  4. DAY 09 Python 操作Excel
  5. OC面向对象的三大特征(封装 继承 多态)习题2 复合
  6. 使用PHP模拟post提交数据
  7. response是什么意思中文_response是什么意思
  8. SQLyog的安装及使用
  9. 我是如何成为一名程序员的?
  10. 一天一条Linux指令-tailf