ListView和RecyclerView缓存的区别

ListView

1.继承重写BaseAdapter类

2.自定义ViewHolder与ConvertView的优化

布局

单一布局,只可以实现纵向效果

缓存机制

两级缓存

mActiveViews:快速重用屏幕上可见的列表项,不需要重新createView和bindView;

mScrapViews:缓存离开屏幕的ItemView,目的是让即将进入屏幕的ItemView重用.

    

刷新

通常情况下的刷新都是全局刷新(消耗资源) notifyDataSetChanged()

局部刷新步骤:①实现onItemChanged()方法

       ②通过onItemChanged()方法获取对应的position

       ③通过getView()实现局部的刷新

点击事件

ListView实际是自带点击事件的,可以直接调用API:onItemClickListener();onItemLongListener();onSelecterListener()

方法二:

①通过getItemId()返回的id对用Item(此处不可以通过position,因为一旦有头部和底部会出现越界的问题,在此处不建议使用)

②在Adapter中针对,每一个item写在getView()方法中

空数据

具有处理空数据的方法setEmptyView()

RecyclerView

布局

不光可以实现纵向布局,还可以实现横向,表格,瀑布流等布局。

缓存机制

四级缓存机制:支持多个离ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有 RecyclerView共用同一个RecyclerViewPool(缓存池)。

mAttachedScrap:快速重用屏幕上可见的列表项,不需要重新createView和bindView;与ListView的mActiveViews作用一致。

CachedViews + mReyclerViewPool:缓存离开屏幕的ItemView,目的是让即将进入屏幕的ItemView重用与mScrapViews功能一致。

mRecyclerPool可以供多个RecyclerView共同使用,在特定场景下,如viewpaper+多个列表页下有优势

mViewCacheExtension:需要用户定制,默认情况下不实现,自定义获取holder缓存

缓存:

View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态);

   

 

刷新:

局部刷新notifyItemChanged

点击事件

只有唯一的API:addOnItemTouchListener();

空数据

不含有处理空数据的方法,需要自己进行数据空的判断

ListView和RecyclerView缓存机制对比:

1. 层级不同:

RecyclerView比ListView多两级缓存,支持多个离ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有RecyclerView共用同一个RecyclerViewPool(缓存池)。

ListView(两级缓存):

    

RecyclerView(四级缓存):

    

ListView和RecyclerView缓存机制基本一致:

1). mActiveViews和mAttachedScrap功能相似,意义在于快速重用屏幕上可见的列表项ItemView,而不需要重新createView和bindView;

2). mScrapView和mCachedViews + mReyclerViewPool功能相似,意义在于缓存离开屏幕的ItemView,目的是让即将进入屏幕的ItemView重用.

3). RecyclerView的优势在于a.mCacheViews的使用,可以做到屏幕外的列表项ItemView进入屏幕内时也无须bindView快速重用;b.mRecyclerPool可以供多个RecyclerView共同使用,在特定场景下,如viewpaper+多个列表页下有优势.客观来说,RecyclerView在特定场景下对ListView的缓存机制做了补强和完善。

2.缓存不同:

1). RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为:

View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态);

2). ListView缓存View。

RecyclerView中mCacheViews(屏幕外)获取缓存时,是通过匹配pos获取目标位置的缓存,这样做的好处是,当数据源数据不变的情况下,无须重新bindView:

而同样是离屏缓存,ListView从mScrapViews根据pos获取相应的缓存,但是并没有直接使用,而是重新getView(即必定会重新bindView)

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ListViewRecyclerView是Android中两种常见的用于展示列表数据的视图组件。它们都是用于滚动显示大量数据的组件,但随着时间的发展和性能优化的需求,RecyclerView逐渐取代了ListView作为首选。下面是两者的主要区别: 1. 性能与效率: - ListView: 在早期版本的Android中,ListView是标准的列表视图,虽然基础功能稳定,但对于大量数据时,由于内部使用的布局管理器(如AbsListView)的限制,可能导致性能下降,尤其是在滚动时。 - RecyclerView: 它基于Google的ViewHolder和ItemAnimator机制,优化了视图的缓存和复用,提升了渲染速度,尤其是在Android Lollipop及以上版本中,性能表现更加出色。 2. 动画支持: - ListView: 动画处理相对简单,可以通过设置Adapter的动画属性来实现简单的滑动过渡。 - RecyclerView: 内置动画API支持更丰富的动画效果,可以通过ItemAnimator轻松实现平滑的添加、删除和更换动画。 3. 扩展性: - ListView: 直接在Adapter中处理子项的绘制和数据绑定,扩展性相对较差,尤其是自定义布局时。 - RecyclerView: 提供了更大的灵活性,允许开发者使用自定义的View或ViewHolder,以及单独控制每个Item的布局和绘制,使得自定义更为方便。 4. 数据集操作: - ListView: 需要手动管理数据集的变化并通知Adapter,可能会导致复杂性和错误。 - RecyclerView: 更为现代的数据集处理方式,通过 DiffUtil 类简化了数据集更新操作,提高了代码的清晰度和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值