【Android 源码】RecylerView的深入理解

RecyclerView源码浅析 大致了解RecyclerView的绘制流程。后期扩充RecyclerVIew的复用机制、动画、滚动处理。 阅读详情


深入理解 RecyclerView 的绘制流程和滑动原理(匠心巨作-上)
深入理解 RecyclerView 的嵌套滑动机制(匠心巨作-中)
深入理解 RecyclerView 的回收复用缓存机制详解(匠心巨作-下)
Android RecyclerView 缓存机制

绘制流程:RecyclerView的绘制三个步骤

1. setLayoutManager

必要的步骤,给RecyclerView设置布局管理器,常见的布局管理器有:线性布局管理器LinearLayoutManager,网格布局管理器GridLayoutManager,瀑布流式管理器StaggeredGridLayoutManager。
源码解析:重置回收 -> LayoutManager与RecyclerView关联起 -> 请求重绘requestLayout, 进入measure,layout,draw流程

public void setLayoutManager(@Nullable LayoutManager layout) {
    // 如果新设置的 LayoutManager 和当前已有的 LayoutManager 是同一个,直接返回,无需操作
    if (layout == mLayout) {
        return;
    }

    // 停止当前的滚动操作(比如快速滑动或 fling 操作)
    stopScroll();

    // 如果当前已经有 LayoutManager,则需要先清理它相关的视图和资源
    if (mLayout != null) {
        // 如果有 ItemAnimator,结束所有正在执行的动画
        if (mItemAnimator != null) {
            mItemAnimator.endAnimations();
        }

        // 移除并回收所有由 LayoutManager管理的视图(包括已废弃的视图)
        mLayout.removeAndRecycleAllViews(mRecycler);
        mLayout.removeAndRecycleScrapInt(mRecycler); // 回收 scrap 中的视图

        // 清空 Recycler 中的所有缓存视图
        mRecycler.clear();

        // 如果 RecyclerView 已经附加到 Window 上,调用 LayoutManager 的 dispatchDetachedFromWindow
        if (mIsAttached) {
            mLayout.dispatchDetachedFromWindow(this, mRecycler);
        }

        // 将 LayoutManager 与 RecyclerView 解除绑定
        mLayout.setRecyclerView(null);

        // 置空当前 LayoutManager
        mLayout = null;
    } else {
        // 如果当前没有 LayoutManager,也清空 Recycler 的缓存视图
        mRecycler.clear();
    }

    // 为了防止 ItemAnimator 出现问题,再次移除所有子视图(防御性操作)
    mChildHelper.removeAllViewsUnfiltered();

    // 将新的 LayoutManager 赋值给成员变量
    mLayout = layout;

    // 如果新 LayoutManager 不为 null
    if (layout != null) {
        // 检查该 LayoutManager 是否已经绑定到另一个 RecyclerView,如果是,抛出异常
        if (layout.mRecyclerView != null) {
            throw new IllegalArgumentException("LayoutManager " + layout
                    + " is already attached to a RecyclerView:"
                    + layout.mRecyclerView.exceptionLabel());
        }

        // 将该 LayoutManager 绑定到当前 RecyclerView
        mLayout.setRecyclerView(this);

        // 如果 RecyclerView 已经附加到 Window 上,通知 LayoutManager 附加事件
        if (mIsAttached) {
            mLayout.dispatchAttachedToWindow(this);
        }
    }

    // 更新 Recycler 的视图缓存大小
    mRecycler.updateViewCacheSize();

    // 请求重新布局,触发 LayoutManager 重新布局子视图
    requestLayout();
}

2. dispatchLayoutStep系列方法

理解measure,layout,draw流程之前需要先理解dispatchLayoutStep系列方法,这一系列方法分别对应 RecyclerView 在执行布局时的三个主要阶段。此处省略源码,只需要理解其核心作用。

  • dispatchLayoutStep1()
    预处理:表示进行预布局,适配器更新、动画运行、保存当前视图的信息等工作;
    mState.mLayoutStep == State.STEP_START才会执行。
    onMeasure,onLayout方法都可能会执行
  • dispatchLayoutStep2()
    核心阶段,测量和布局所有需要显示的 itemView,实际上调用的是onLayoutChildren方法。
    onMeasure,onLayout方法都可能会执行
  • dispatchLayoutStep3()
    后处理:表示布局最后一步,保存和触发有关动画的信息,相关清理等工作。
    onLayout中执行

3. onMeasure

  • 源码理解
    onMeasure()主要是RecyclerView宽高测量工作,主要有两种情况:
    (1)当RecyclerView的宽高为match_parent或者精确值时,即measureSpecModeIsExactly = true,此时只需要测量自身的宽高就知道RecyclerView的宽高,测量方法结束(defaultOnMeasure);
    (2)当RecyclerView的宽高为wrap_content时,即measureSpecModeIsExactly = false,会往下执行dispatchLayoutStep1()和dispatchLayoutStep2(),就是遍历测量ItemView的大小从而确定RecyclerView的宽高,这种情况真正的测量操作都是在dispatchLayoutStep2()中完成。
    @Override
    protected void onMeasure(int widthSpec, int heightSpec) {
        if (mLayout == null) {//如果mLayout为空则采用默认测量,然后结束
            defaultOnMeasure(widthSpec, heightSpec);
            return;
        }
        if (mLayout.mAutoMeasure) {//如果为自动测量,默认为true
        	final int widthMode = MeasureSpec.getMode(widthSpec);
            final int heightMode = MeasureSpec.getMode(heightSpec);
        	mLayout.onMeasure(mRecycler, mState, widthSpec, heightSpec);//测量RecyclerView的宽高
        	 //当前RecyclerView的宽高是否为精确值
        	final boolean measureSpecModeIsExactly =
                    widthMode == MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY;
            if (measureSpecModeIsExactly || mAdapter == null) {//如果RecyclerView的宽高为精确值或者mAdapter为空,则结束
                return;
            }
            //RecyclerView的宽高为wrap_content时,即measureSpecModeIsExactly = false则进行测量
            //因为RecyclerView的宽高为wrap_content时,需要先测量itemView的宽高才能知道RecyclerView的宽高
            if (mState.mLayoutStep == State.STEP_START) {//还没测量过
                dispatchLayoutStep1();//1.适配器更新、动画运行、保存当前视图的信息、运行预测布局
            }
            dispatchLayoutStep2();//2.最终实际的布局视图,如果有必要会多次运行
            //根据itemView得到RecyclerView的宽高
            mLayout.setMeasuredDimensionFromChildren(widthSpec, heightSpec);
        }
    }

4. onLayout

  • 源码理解
    1、如果没在onMeasure阶段提前测量子ItemView,即RecyclerView宽高为match_parent或者精确值时,调用dispatchLayoutStep1()和dispatchLayoutStep2()测量itemView宽高;
    2、如果在onMeasure阶段提前测量子ItemView,但是子视图发生了改变或者期望宽高和实际宽高不一致,则会调用dispatchLayoutStep2()重新测量;
    3、最后都会执行dispatchLayoutStep3()方法。
   @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        TraceCompat.beginSection(TRACE_ON_LAYOUT_TAG);
        dispatchLayout(); //直接调用dispatchLayout()方法布局
        TraceCompat.endSection();
        mFirstLayoutComplete = true;
    }
    
  void dispatchLayout() {
  		······
        mState.mIsMeasuring = false;//设置RecyclerView布局完成状态,前面已经设置预布局完成了。
        if (mState.mLayoutStep == State.STEP_START) {//如果没在OnMeasure阶段提前测量子ItemView
            dispatchLayoutStep1();//布局第一步:适配器更新、动画运行、保存当前视图的信息、运行预测布局
            mLayout.setExactMeasureSpecsFrom(this);
            dispatchLayoutStep2();
        } else if (mAdapterHelper.hasUpdates() || mLayout.getWidth() != getWidth()
                || mLayout.getHeight() != getHeight()) {//前两步完成测量,但是因为大小改变不得不再次运行下面的代码
            mLayout.setExactMeasureSpecsFrom(this);
            dispatchLayoutStep2();//布局第二步:最终实际的布局视图,如果有必要会多次运行
        } else {
            mLayout.setExactMeasureSpecsFrom(this);
        }
        dispatchLayoutStep3();//布局第三步:最后一步的布局,保存视图动画、触发动画和不必要的清理。
    }

5. onDraw

  • 源码解析
    在 RecyclerView 自身绘制完成后,依次调用所有添加的 ItemDecoration 的 onDraw() 方法,用于在 itemView 绘制之前绘制底层装饰内容。
    ItemDecoration 是 RecyclerView 提供的一个抽象类,用于在 item 绘制前后添加装饰效果,比如:设置 item 的间隔,添加分组标题绘制边框、阴影等视觉效果
    @Override
    public void onDraw(Canvas c) {
        super.onDraw(c);//所有itemView先绘制
		//分别绘制ItemDecoration
        final int count = mItemDecorations.size();
        for (int i = 0; i < count; i++) {
            mItemDecorations.get(i).onDraw(c, this, mState); 
        }
    }

6. 绘制流程总结

在这里插入图片描述

7. 缓存生命周期

在这里插入图片描述

绘制流程:LinearLayoutManager填充、测量、布局过程

itemView的真正布局时委托给各个的LayoutManager中处理,上面LinearLayoutManager可以知道dispatchLayoutStep2()是实际布局视图步骤,通过LayoutManager调用onLayoutChildren()方法进行布局itemView

1. onLayoutChildren()布局itemView

源码省略,只关注其核心逻辑

  • 初始化布局锚点
    确定布局的起始位置,比如从顶部开始往下布局(垂直方向),或者从左到右(水平方向)。这通常基于滚动状态或数据变化类型(如新增、删除等)来决定。
  • 回收不可见的 View
    调用 detachAndScrapAttachedViews 方法,将当前已经不可见的 item view 放入回收池(Recycler),以便后续复用。
  • 确定布局方向和偏移量
    根据当前滚动方向(如向上或向下)确定布局的方向和起始偏移量。例如,向下滚动时,新的 item 会从屏幕底部进入。
  • 填充可见区域(fill 方法)
    通过 fill() 方法不断添加新的 item view 到屏幕上,直到填满可见区域。
  • 处理剩余空间或边界情况
    布局完成后,如果还有剩余空间,可能需要做一些对齐处理(如居中、靠左/右等)。

2. fill()开始填充itemView

while()循环,循环执行layoutChunk()填充一个itemView到屏幕,同时返回这次填充的区域大小
首先根据屏幕还有多少剩余空间remainingSpace,根据这个数值减去子View所占的空间大小,小于0时布局子View结束,如果当前所有子View还没有超过remainingSpace时,调用layoutChunk()安排View的位置。

3. layoutChunk()对itemView创建、填充、测量、布局

  • layoutState.next(recycler)从缓存中获取itemView,如果没有则创建itemView;
  • 根据实际情况来添加itemView到RecyclerView中,最终调用的还是ViewGroup的**addView()**方法;
  • measureChildWithMargins()测量itemView大小包括父视图的填充、项目装饰和子视图的边距;
  • 根据计算好的left, top, right, bottom通过layoutDecoratedWithMargins()使用坐标在RecyclerView中布局给定的itemView。

4. 流程总结

在这里插入图片描述

RecyclerView 的回收复用缓存机制

1. item的五种状态

在这里插入图片描述

2. 多级缓存定义

RecylerView的缓存有Reclyer类管理,优先级顺序为:Scrap -> Cache -> Extension -> Pool -> 新创建。有如下几种缓存:

  • Srcap缓存:mAttachedScrap
    Srcap缓存不参与列表滚动时的回收复用,作为重新布局时的临时缓存,它的作用是,缓存当界面重新布局前和界面重新布局后都出现的ViewHolder,这些ViewHolder是无效、未移除、未标记的。
    在这些无效、未移除、未标记的ViewHolder之中,mAttachedScrap负责保存其中没有改变的ViewHolder
  • Srcap缓存:mChangedScrap
    保存那些数据发生变化(如调用 notifyItemChanged())的 ViewHolder。
    这些 ViewHolder 仍可见,但其数据已经过时,需要重新绑定
    在这里插入图片描述
  • CacheView
    用于RecyclerView列表位置产生变动时,对刚刚移出屏幕的view进行回收复用。
    CacheView的最大容量为2,缓存一个新的ViewHolder时,如果超出了最大限制,那么会将CacheView缓存的第一个数据添加到RecycledViewPool后再移除掉,最后才会将新的ViewHolder添加进来。
  • ViewCacheExtension
  • ViewCacheExtension是缓存拓展的帮助类,额外提供了一层缓存池给开发者。几乎没有用到
  • RecylerViewPool
    ecycledViewPool是Recycler的终极回收站。数据结构:SparseArray嵌套一个ArraryList的形式。根据不同itemType来缓存ViewHolder,默认每个类型5个

3. 回收原理

调用链如下:

  • onLayoutChildren方法:removeAndRecycleAllViews移除所有的子View,再通过detachAndScrapAttachedViews分离item
    detachAndScrapAttachedViews()的作用就是把当前屏幕所有的item与屏幕分离,将他们从RecyclerView的布局中拿下来,保存到list中,在重新布局时,再将ViewHolder重新一个个放到新的位置上去

recycleViewHolderInternal:detachAndScrapAttachedViews满足特定条件就会走这个方法
根据item的状态放到不同的缓存中去(核心还是上边item状态和缓存)

4. 复用原理

调用链如下:

  • onLayoutChildren
  • fill()
  • layoutChunk()
  • layoutState.next(recycler)
  • tryGetViewHolderForPositionByDeadline:核心还是根据上述item状态,缓存的定义,item的position去寻找对应的viewholder

5. 结合具体场景理解

  • Scrap缓存的理解
    在这里插入图片描述
    在一个手机屏幕中,将itemB删除,并且调用notifyItemRemoved()方法,如果item是无效并且被移除的就会回收到其他的缓存,否则都是缓存到Scrap中,那么mAttachedScrap和mChangedScrap会分别存储itemView,itemA没有任何的变化,存储到mAttachedScrap中,itemB虽然被移出了,但是还有效,也被存储到mAttachedScrap中(但是会被标记REMOVED,之后会移除);itemC和itemD发生了变化,位置往上移动了,会被存储到mAttachedScrap中。删除时,ABCD都会进入Scrap中;删除后,ACD都会回来,A没有任何变化,CD只是位置发生了变化,内容没有发生变化。

  • CacheView缓存的应用

在这里插入图片描述
CacheView缓存刚刚变为不可见的view,如果当前View再次进入屏幕中的时候,进行精准匹配,这个itemView还是 之前的itemView,那么会从CacheView中获取ViewHolder进行复用。如果一直向某一个方向滑动,那么CacheView将会不断替换缓存里面的ViewHolder(CacheView最多只能存储2个),将替换掉的ViewHolder先放到RecycledViewPool中。在CacheView中拿不到复用的ViewHolder,那么最后只能去RecycledViewPool中获取

6. 回收和复用流程总结

在这里插入图片描述

滑动原理

1. 普通滑动

2. 惯性滑动

3. 嵌套滑动

刷新数据的常见api

性能优化

补充个人理解核心问题:

1. onLayoutChildren如何理解这个方法?

onLayoutChildren 是 LayoutManager 的布局入口,相当于 ViewGroup 的 onLayout。
每次 RecyclerView 需要完整重新布局时回调。
第一步一般调用 detachAndScrapAttachedViews,剥离现有子 View 放入临时缓存。
然后遍历需要展示的 position,通过 recycler.getViewForPosition 拿到 view,完成测量,计算坐标,调用 layoutDecoratedWithMargins 摆放子 View。

Android RecyclerView 1.RecyclerView RecyclerView是Android 5.0推出的,是support-v7包中的新组件,它被用来代替ListView和GridView,并且能够实现瀑布流的布局,更加高级并且更加灵活,提供更为高效的回收复用机制,同时实现管理与视图的解耦合。RecyclerView提供了一种插拔式的体验,高度的解耦,异常的灵活,只需设置其提供的不同的LayoutManager,ItemAnimator和ItemDecoration,就能实现不同的效果。 RecyclerView的优点: ①支 阅读详情

相关推荐

RecyclerView源码解析

基础 RecyclerView相对于以前的ListView来说,更加灵活。其所拆分出来的各个类的分工更加明确,很好地体现了我们经常所说的职责单一原则。我们这里先对其中使用到的类进行一下讲解 LayoutManager:RecyclerView的布局管理者,主要负责对于RecyclerView子View的测量和布局工作。 RecyclerView.Recycler:缓存的核心类。RecyclerView强大的缓存能力都是基于这个类来实现的。是缓存的核心工具类。 Adapter:Adapter的基类。负责将V

鸿蒙开发知识记录 2172

RecyclerView源码讲解系列(一)总览

​从今天开始RecyclerView源码讲解系列正式开始更新,每周一篇。欢迎大家持续关注。RecyclerView是Android中十分重要的视图组件,可以说基本每个APP的主页面都用到了RecyclerView,由此可见其重要性。那么问题来了,如何对RecyclerView做性能优化、并且封装成一个简单易用且功能强大的RecyclerView。那么首先第一步就是先了解RecyclerView,对它的整体设计有一个总览的概念。

Y810614的博客 1620

DRAM知识整理系列(三):部分时序参数整理

一、tCL-tRCD-tRP-tRAS(第一时序) 内存是根据行和列寻址的,当请求触发后,最初是tRAS(Active to precharge Delay),预充电后,内存才真正开始初始化RAS(Row Address Strobe)。一旦tRAS激活后,RAS开始进行需要数据的寻址。首先是行地址,然后初始化tRCD(RAS to CAS Delay),周期结束,接着通过CAS(Column Address Strobe)访问所需数据的十六进制地址。其中,从CAS开始到CAS结束,就是CAS延迟(即t

不吃鱼的猫的博客 7万+

RecyclerView源码解析(三):RecyclerView的缓存机制

终于分析完了这个巨长无比的方法了,现在估计还是很疑惑,现在让我们对上面这个过程进行一下总结。最后我光看到了将viewHolder添加进入RecyclerPool而没有看到清除,所以对其源码进行了查看,发现mRecyclerPool是通过ArrayList存储viewHolder,用SparseArray存储与之相关的一些信息,通过这两个容器检查了回收池中指定类型的视图是否已满。如果池已满,就直接返回,不会将视图添加到回收池中。这是为了限制池中视图的数量,以防止占用过多内存。

Tai_Monster的博客 1039

Linux -- 图形界面配置Samba;system-config-samba工具

图形界面配置Samba6.6.1 system-config-sambasystem-config-samba是Red Hat公司专门为Samba服务器管理编写的图形界面的管理工具,通过system-config-samba几乎可以完成对Samba服务器的所有配置,所以在只希望通过Samba服务器实现一些简单的资源共享时,system-config-samba是一个不错的选...

weixin_33695450的博客 2200

PDN设计

作者:AirCity 2020.2.6 Aircity007@sina.com 本文所有权归作者Aircity所有 PDN设计的目的是降低电源纹波水平,减小电压跌落。我们通常要求LDO的文波水平是30mV,DCDC是50mV,超过这个就需要PDN设计。 PDN设计的方法是用不同的容值,合适的总电容量,降低电源平面与地平面之间的交流阻抗,确定容值总量和电容大小的过程,就是PDN设计过程。 为什么需...

AirCity123的博客 4147

【Android面试】RecylerView专题

Android RecylerView面试专题

studyForMokey的博客 474

全国充电站分布数据

CnOpenData推出的充电站数据覆盖全国34个省份的3万条数据,包含充电站名称、省份名称、省份代码、商圈、经纬度等地理信息以及商业类型、评分、消费等衍生信息,能为城市规划、环境科学、市场分析、技术发展和社会经济研究等多个领域提供宝贵的数据支持。

Sunny9qx的博客 4025

源码:RecyclerView核心知识点

源码之RecyclerView

weixin_42277946的博客 1263

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

shannanshouyin的博客 1326

Flatten 层的深度理解与运用

Flatten 层的深度理解与运用

你要拥有一个你喜欢并且热爱的人生 7030

深入源码分析RecyclerView缓存复用原理

是Android日常开发中经常使用的控件,了解其源码,明白其中的缓存复用机制是十分有必要的;ღ( ´・ᴗ・` )

故不积跬步无以至千里 2269

HCIE-Datacom笔试题库

关于HCIE Datacom笔试考试题目整理!

坏坏-5的博客 608

Android RecyclerView使用简述

  RecyclerView是Android中非常受欢迎的控件,RecyclerView是官方在Android5.0之后新添加的控件,推出用来替代传统的ListView和GridView列表控件,所以如果你还在使用ListView的话可以替换为RecyclerView了。文章的功能可以先运行看看效果,扫码下载APK   对于RecyclerView的使用根据实际项目进行说明,一些功能可能是你现在正在做的,对你有帮助也说不定。  创建一个名为RecyclerViewDemo的Android项目。注意Andro

晨曦 2万+

30. 如何使用 SEGW 的 redefine 功能对 SAP 标准 OData 服务进行扩展

SAP 发布了很多标准的 Fiori 应用,可以通过笔者的文章里提到的进行浏览。比如 My Opportunities 就是 SAP CRM 领域的一个 Fiori 应用:下图是 Opportunity 明细页面的 Info 标签页:假设我们想在这些标准字段的末尾增添一个新字段 Created By,用来维护当前 Opportunity 的创建者。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1171

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

RecyclerView源码解析 (一):RecyclerView之View的工作流程

在Android中如果想要实现一个可滑动的列表,你会怎么做呢?对于我来说,我接触到的第一个列表类的控件就是ListView,其次就是RecylerView。目前来说,ListView已经很少用了,作为JetPack库中一部分,RecylerView显然是主流。可是对于我来说,我只知道实现RecyclerView的最简单的使用,而不了解其原理,在想要实现一些进阶效果时就有心而无力。

Tai_Monster的博客 722

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android基础——RecyclerView

RecycleViewRecycleView是什么?RecycleView使用三级目录 RecycleView是什么? RecycleView是进阶版的ListView,不仅可以实现ListView的纵向滑动,还可以横向滑动和瀑布流滑动。 RecycleView使用 使用RecycleView需要在build.gradle中添加相应的依赖库 三级目录 ...

松仔Log的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

RecyclerView源码分析

RecyclerView源码分析1.宏观认识2.绘制的源码解析2.1.OnMeasure :与布局流程相互结合在一起的自动测绘过程可以分为两部分:2.2.OnLayout()onLayout总结2.3.OnDraw()3.缓存机制优点4.缓存策略 1.宏观认识 RecyclerView是谷歌官方出的一个用于大量数据展示的新控件,支持RecyclerView高效运行有六个类. 属性名称 功能描述 Adapter 为每一项Item创建视图 ViewHolder 承载Item视图的子布局

Barryjacket的博客 1010

Android基础-RecyclerView详解

资料 ItemDecoration深入解析与实战(一)——源码分析 一款不错的流式布局LayoutManager-FlowLayout

AdrianAndroid的专栏 2100

android进阶篇02、RecyclerView回收复用机制源码解析

、、//1。

2401_84006689的博客 1023

Android开发基础——RecyclerView

RecyclerView是比LitView更为强大的控件,其优化了ListView的不足。Android官方也更推荐使用RecyclerView。

止步听风的博客 4319

【进阶】RecyclerView源码解析(一)——绘制流程

1.【进阶】RecyclerView源码解析(一)——绘制流程 2.【进阶】RecyclerView源码解析(二)——缓存机制 3.【进阶】RecyclerView源码解析(三)——深度解析缓存机制 引言 自从Google出了RecyclerView后,基本上列表的场景已经完全替代了原来的ListView和GridView,现在不仅仅是列表,多样式(俗称盖楼),复杂页...

被代码淹没的小伙子的博客 6968

最全面的RecyclerView源码解析

相信很多人用RecyclerView已经很久了,但还是不得不感叹 RecyclerView的强大,性能、扩展性等方面都很强大。网上看了很多源码方面对RecyclerView,觉得还不够全面,而且自己不走一遍源码总感觉会很容易忘记。 打开RecyclerView类,发现有11090行代码,千万不要震惊,慢慢看。 整体看了下RecyclerView的架构,你会惊奇于这个优雅的设计,高度解耦,灵活性...

jieqiang3的专栏 8340

Android之recyclerView

是 Android 提供的一种高级组件,用于在屏幕上展示大量数据(如列表或瀑布流布局)的视图。recycleview其实是一种容器,显示所有的内容和交互会事先预加载一屏,提高了效率注意:上面三个视图是预加载好的,三个外的视图就放在重复队列。

hxl03100721的博客 3033
上一篇: 【跨端技术React Native】入门学习随笔记录
下一篇: 【Android面试】Kotlin语言专题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值