
ListView 与 RecyclerView 简单对比
发布日期:2021-05-07 03:17:49
浏览次数:16
分类:原创文章
本文共 2857 字,大约阅读时间需要 9 分钟。
RecyclerView 与 ListView 的主要区别:
- 布局效果对比
- 常用功能与API对比
- 在Android L引入嵌套滚动机制(NestedScrolling)
ListView与RecyclerView的简单使用:
ListView:
1. 继承重写BaseAdapter类;
2. 自定义ViewHolder与convertView的优化(判断是否为null);
RecyclerView:
1. 继承重写RecyclerView.Adapter与RecyclerView.ViewHolder
2. 设置LayoutManager,以及layout的布局效果
区别:
1. ViewHolder的编写规范化,ListView是需要自己定义的,而RecyclerView是规范好的;
2. RecyclerView复用item全部搞定,不需要想ListView那样setTag()与getTag();
3. RecyclerView多了一些LayoutManager工作,但实现了布局效果多样化;
布局效果:
- ListView 的布局比较单一,只有一个纵向效果;
- RecyclerView 的布局效果丰富, 可以在LayoutMananger中设置:线性布局(纵向,横向),表格布局,瀑布流布局
- 在RecyclerView 中,如果存在的LayoutManager不能满足需求,可以在LayoutManager的API中自定义Layout:
例如:scrollToPosition(), setOrientation(), getOrientation(), findViewByPosition()等等;
空数据处理:
在ListView中有个setEmptyView() 用来处理Adapter中数据为空的情况;但是在RecyclerView中没有这个API,所以在RecyclerView中需要进行一些数据判断来实现数据为空的情况;
HeaderView 与 FooterView:
- 在ListView中可以通过addHeaderView() 与 addFooterView()来添加头部item与底部item,来当我们需要实现下拉刷新或者上拉加载的情况;而且这两个API不会影响Adapter的编写;
- 但是RecyclerView中并没有这两个API,所以当我们需要在RecyclerView添加头部item或者底部item的时候,我们可以在Adapter中自己编写,根据ViewHolder的Type与View来实现自己的Header,Footter与普通的item,但是这样就会影响到Adapter的数据,比如position,添加了Header与Footter后,实际的position将大于数据的position;
局部刷新
- 在ListView中通常刷新数据是用notifyDataSetChanged() ,但是这种刷新数据是全局刷新的(每个item的数据都会重新加载一遍),这样一来就会非常消耗资源;
- RecyclerView中可以实现局部刷新,例如:notifyItemChanged();
- 但是如果要在ListView实现局部刷新,依然是可以实现的,当一个item数据刷新时,我们可以在Adapter中,实现一个onItemChanged()方法,在方法里面获取到这个item的position(可以通过getFirstVisiblePosition()),然后调用getView()方法来刷新这个item的数据;
动画效果:
- 在RecyclerView中,已经封装好API来实现自己的动画效果;有许多动画API,例如:notifyItemChanged(), notifyDataInserted(), notifyItemMoved()等等;如果我们需要淑贤自己的动画效果,我们可以通过相应的接口实现自定义的动画效果(RecyclerView.ItemAnimator类),然后调用RecyclerView.setItemAnimator() (默认的有SimpleItemAnimator与DefaultItemAnimator);
- 但是ListView并没有实现动画效果,但我们可以在Adapter自己实现item的动画效果;
ItemTouchHelper:
- 创建ItemTouchHelper实例,然后在ItemTouchHelper.SimpleCallback(),然后在Callback中实现getMovementFlags(), onMove(), onSwiped(), 最后调用RecyclerView的attachToRecyclerView方法;
Item点击事件:
- 在ListView中有onItemClickListener(), onItemLongClickListener(), onItemSelectedListener(), 但是添加HeaderView与FooterView后就不一样了,因为HeaderView与FooterView都会算进position中,这时会发现position会出现变化,可能会抛出数组越界,为了解决这个问题,我们在getItemId()方法(在该方法中HeaderView与FooterView返回的值是-1)中通过返回id来标志对应的item,而不是通过position来标记;但是我们可以在Adapter中针对每个item写在getView()中会比较合适;
- 而在RecyclerView中,提供了唯一一个API:addOnItemTouchListener(),监听item的触摸事件;我们可以通过RecyclerView的addOnItemTouchListener()加上系统提供的Gesture Detector来实现像ListView那样监听某个item某个操作方法;
嵌套滚动机制:
- 在事件分发机制中,Touch事件在进行分发的时候,由父View向子View传递,一旦子View消费这个事件的话,那么接下来的事件分发的时候,父View将不接受,由子View进行处理;但是与Android的事件分发机制不同,嵌套滚动机制(Nested Scrolling)可以弥补这个不足,能让子View与父View同时处理这个Touch事件,主要实现在于NestedScrollingChild与NestedScrollingParent这两个接口;而在RecyclerView中,实现的是NestedScrollingChild,所以能实现嵌套滚动机制;
- ListView就没有实现嵌套滚动机制;
总结:
这里只是客观的分析ListView与RecyclerView的差异,而在实际场景中,我们应该根据自己的需求来选择使用RecyclerView还是ListView,毕竟,适合业务需求的才是最好的。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月30日 07时09分34秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
NC15553 数学考试(线性DP)
2021-05-08
MySQL两阶段提交、崩溃恢复与组提交
2021-05-08
MySQL隐藏文件.mysql_history风险
2021-05-08
如何通过文件解析MySQL的表结构
2021-05-08
ClickHouse 适用场景调研文档
2021-05-08
C++的编译过程及原理
2021-05-08
Vue——父组件将方法传递给子组件
2021-05-08
文件加密软件对于企业发展而言有何优势?局域网数据防泄密工作应该如何入手?
2021-05-08
Beautiful Soup基础入门
2021-05-08
点击控制盒子移动
2021-05-08
js求阶乘
2021-05-08
小程序图片正确使用方式(防止发布之后不显示)
2021-05-08
C++基础学习笔记08——模板
2021-05-08
Java学习
2021-05-08
Js函数
2021-05-08
Python机器学习算法基础概述
2021-05-08
关于OCR的一些有用的技术博客文章链接
2021-05-08
jquery中用on事件委托的方式绑定事件
2021-05-08
蓝桥杯 2016c/c++A组 方格填数
2021-05-08
L1-039 古风排版 (20分)
2021-05-08