RecyclerView 与 ListView(二):缓存

Observer & Observable

Recycler没有采用系统的Observer,因为自己需要接收通知的方法过多,所以自己设计了一个观察者AdapterDataObserver
在这里插入图片描述

RecyclerView ListView 缓存层级

View的缓存
在这里插入图片描述
ListView
在这里插入图片描述
在这里插入图片描述
RecyclerView
在这里插入图片描述
在这里插入图片描述
ListView(两级缓存)
在这里插入图片描述
RecyclerView(四级缓存)
在这里插入图片描述
ListView获取缓存的流程
在这里插入图片描述
RecyclerView获取缓存的流程
在这里插入图片描述

  1. ListView回收机制
    ListView为了保证Item View的复用,实现了一套回收机制,该回收机制的实现类是RecycleBin,他实现了两级缓存:
  • View[] mActiveViews: 缓存屏幕上的View,在该缓存里的View不需要调用getView()。不需要重新绑定数据。
  • ArrayList[] mScrapViews: 每个Item Type对应一个列表作为回收站,缓存由于滚动而消失的View,此处的View如果被复用,会以参数的形式传给getView()。会调用getView(),需要重新绑定数据。
  1. RecyclerView回收机制
    Recycler是RecyclerView回收机制的实现类,他实现了四级缓存:
  • mAttachedScrap: 缓存在屏幕上的ViewHolder,通过数据集position找到缓存。
  • mCachedViews: 缓存屏幕外的ViewHolder,默认缓存 2 个 holder,可以自定义。通过数据集position找到缓存。与第一层缓存策略差不多,不需要重新绑定数据。
  • mViewCacheExtensions: 需要用户定制,默认不实现。(默认不需要重新绑定数据,可以自定义?)
  • mRecyclerPool: 缓存池,多个RecyclerView共用,默认缓存 5 个 holder。通过view type查找。需要触发 onBindViewHolder(),需要重新绑定数据。

RecyclerView ListView 缓存层级

  • 在Recycler中实际上缓存VieHolder的有2类集合,一类是可见的ViewHolder数组,一类是不可见的ViewHolder数组,其中可见的数组中又分为数据改变跟没有改变的

  • RecyclerView 的内部维护了一个二级缓存,滑出界面的 ViewHolder 会暂时放到 cache 结构中,而从 cache 结构中移除的 ViewHolder,则会放到一个叫做 RecycledViewPool 的循环缓存池中。

  • RecyclerView比ListView多两级缓存,支持多个ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有RecyclerView共用同一个RecyclerViewPool(缓存池)。cache只关心position,不需要重新绑定数据;RecyclerPool只关心view type,需要重新绑定数据。

  • ListView和RecyclerView最大的区别在于数据源改变时的缓存的处理逻辑,ListView是"一锅端",将所有的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是更加灵活地对每个View修改标志位,区分是否重新bindView。

  • RecyclerView的优势

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

  • 性能并没有提升很多。模块独立(功能 回收 适配器),低耦合,增加了扩展性。

  • 缓存机制很相似,但更性能、强大。

  • ListView两级缓存,RecyclerView四级缓存

RecyclerView ListView 缓存对象

1). RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为:
View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态);

2). ListView缓存View。直接缓存 ItemView。

ListView中通过pos获取的是view,即pos–>view;
RecyclerView中通过pos获取的是viewholder,即pos --> (view,viewHolder,flag);
从流程图中可以看出,标志flag的作用是判断view是否需要重新bindView,这也是RecyclerView实现局部刷新的一个核心。

相关推荐

  1. android recyclerView緩存數量 recycleview缓存

    2024-04-06 10:20:01       24 阅读
  2. ListView

    2024-04-06 10:20:01       61 阅读
  3. ListView

    2024-04-06 10:20:01       37 阅读
  4. <span style='color:red;'>ListView</span>

    ListView

    2024-04-06 10:20:01      39 阅读
  5. <span style='color:red;'>ListView</span>

    ListView

    2024-04-06 10:20:01      19 阅读
  6. Android RecycleView 缓存 itemView 提高滑动流畅度

    2024-04-06 10:20:01       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-06 10:20:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-06 10:20:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-06 10:20:01       87 阅读
  4. Python语言-面向对象

    2024-04-06 10:20:01       96 阅读

热门阅读

  1. Spark, Storm, Flink简介

    2024-04-06 10:20:01       46 阅读
  2. SGM2048

    2024-04-06 10:20:01       33 阅读
  3. ARM Cordio WSF(二)——API接口

    2024-04-06 10:20:01       32 阅读
  4. 类全局变量与类单例模式优缺点比较

    2024-04-06 10:20:01       42 阅读
  5. XSS分类

    2024-04-06 10:20:01       38 阅读
  6. 【Node.js】ioredis

    2024-04-06 10:20:01       49 阅读
  7. python实现UDP客户端

    2024-04-06 10:20:01       39 阅读
  8. PyTorch中view()函数用法说明

    2024-04-06 10:20:01       39 阅读
  9. 【科普】卫星如何定位汽车

    2024-04-06 10:20:01       39 阅读
  10. Go语言创建HTTP服务器

    2024-04-06 10:20:01       33 阅读
  11. [Flutter]导入singular_flutter_sdk后运行到Android报错

    2024-04-06 10:20:01       39 阅读
  12. 大模型推理--KV cache解读

    2024-04-06 10:20:01       41 阅读
  13. babyAGI(6)-babyCoder源码阅读4_Embbeding代码实现

    2024-04-06 10:20:01       32 阅读
  14. 数据库的透视

    2024-04-06 10:20:01       41 阅读
  15. 自动化运维(八)Ansible 之核心模块

    2024-04-06 10:20:01       41 阅读
  16. npm常用命令详解

    2024-04-06 10:20:01       36 阅读