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的观点是它支持三种适配器的默认实现:
ArrayAdapter
CursorAdapter
SimpleCursorAdapter
而RecyclerView适配器具有ListView适配器除了支持DB游标和ArrayLists之外的所有功能。在RecyclerView.Adapter中截至目前,我们必须制定一个自定义实现来向适配器提供数据。就像BaseAdapter一样为ListViews做。虽然如果您想了解更多关于RecyclerView适配器实现的
5.分隔符
要在ListView中显示自定义分隔符,可以在ListView XML中轻松添加这些参数:
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区别相关推荐
- ListView和RecycleView的性能比对
ListView相比RecyclerView,有一些优点: addHeaderView(), addFooterView()添加头视图和尾视图. 通过"android:divider&quo ...
- Android截屏截图方法汇总(Activity、View、ScrollView、ListView、RecycleView、WebView截屏截图)
Android截屏 Android截屏的原理:获取具体需要截屏的区域的Bitmap,然后绘制在画布上,保存为图片后进行分享或者其它用途 一.Activity截屏 1.截Activity界面(包含空白的 ...
- 记录一下面试考题一(组件化,ListView和RecyleView区别,App启动,Binder)
1,组件化和ARouter原理 组件化定义:由若干独立的子模块,组合成一个整体,降低模块间的耦合,这些子模块在补足一定的条件下,都可独立运行.主模块也不会因为缺少任意子模块而无法运行.组件之间可以灵活 ...
- Android知识大纲
Android知识大纲 Java垃圾回收机制 Java内存是如何划分的,Java语言为什么要使用垃圾回收机制? 垃圾判定 1. 标记引用算法 2. 根搜索法 虚拟机栈中的引用对象 方法区中的常量引用对 ...
- DataBinding使用指南(一)DataBinding基本使用,双向绑定,ListView RecycleView使用
databing使用指南 简介 简单使用 双向绑定 ListView.RecycleView中的使用 . ListView ListView 中数据的简单展示 数据源改变后数据更新方式 . Recyc ...
- 【Android】RecycleView简单仿漫画APP图片相关样式
真的真的想不到起什么标题好了,这次的内容真的是太简单了,没有什么挑战性,一天以内就完成了.最近在学kotlin,也会有一份kotlin的代码,鉴于很多人都是从java开始进行android开发的,ko ...
- kotlin和java区别!Android平台HTTPS抓包解决方案及问题分析,大厂面试题汇总
缘起 随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑.快速迭代的目的越来越难,还有65535,应用之间的互相调用等等问题,插件化技术应用而生.如果没有插件化 ...
- TemplateView , ListView ,DetailView三种常用类视图用法
有函数类图,还需要类视图??当然,类视图方便,好用,不信你感受感受.... TemplateView get_queryset(self)#默认取出该表所有数据.想要过滤自定义只能在get_query ...
- RecycleView和ViewPager冲突解决与原理
1.概述 在实际开发中,我们经常遇到需要在ListView或RecycleView头部添加ViewPager实现Banner轮播效果,并需要添加下拉刷新,上拉加载功能. 但,横向滑动ViewPager ...
最新文章
- Java学习总结:30
- 【重要】如何彻底夯实CV基础,有三AI三大导师一起带你学习!
- UVA - 11491 Erasing and Winning(奖品的价值)(贪心)
- [转]总结:Apache/Tomcat/JBOSS/Jetty/Nginx区别 .
- 阿里巴巴右侧6滑块VS雅虎右侧6滑块VS自定义6滑块
- 深度隐式表达系列 (一)
- Linux运维需要掌握的技能 (转)
- ubuntu下安装tun模块图文详细教程
- APN(default、mms、supl、dun、hipri接入点类型的区别)
- Python 保留字和关键字的用法
- 百度杯”CTF比赛(十二月场)
- php 499,nginx 499 状态码优化
- redis主从完整配置说明
- 智能化的Conversational UI是移动发展的一个趋势
- pdf编辑器工具哪个好?好用的pdf编辑器一款就够!
- 办理十环认证费用要多少钱?
- 华为机试:身高体重排序(仅有题,待求解)
- 高考倒计时1天 | 百度数字人“考生”度晓晓将挑战高考作文
- iOS及Mac开源资料
- FusionCharts基本使用