RecyclerView使用和原理解析

Android——RecyclerView——Adapter完全图解,带你彻底掌握万能的适配器 1.和RecyclerView的观察关系 一个Adapter可以被多个RecyclerView观察。 那么这个观察关系是怎么建立的呢? 首先定位到RecyclerView内部维护的观察者。 private final RecyclerViewDataObserver mObserver = new RecyclerViewDataObserver(); 第二,找到这个 阅读详情


前言

RecyclerView是Android官方在5.0之后添加的控件,相比原来的ListView和GridView来讲更加灵活,接下来就来介绍一下RecyclerView的使用和原理分析


一、RecyclerView三大件

  • 回收池Recycler:能回收任意Item控件,并返回符合类型的Item控件

  • 适配器Adapter:辅助RecyclerView实现列表展开
    适配器模式:将用户界面展示与交互分离

  • RecyclerView:做触摸事件交互,主要实现边界值判断,根据用户触摸反馈,协调回收池对象与适配器对象间工作

二、使用步骤

1.引入库

代码如下:

    implementation 'androidx.recyclerview:recyclerview:1.1.0'

2.添加布局文件

代码如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rc_data"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginStart="10dp"
        android:layout_marginEnd="10dp"/>

</FrameLayout>

3.添加item布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:layout_marginLeft="18dp"
    android:layout_marginTop="8dp"
    android:layout_marginRight="18dp"
    android:background="@drawable/item_bg">

    <ImageView
        android:id="@+id/content_iv"
        android:layout_width="75dp"
        android:layout_height="50dp"
        android:layout_margin="12dp"
        android:background="#C2EBF8"
        android:src="@mipmap/rc_data_img" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="12dp"
        android:layout_marginEnd="12dp"
        android:layout_marginBottom="12dp"
        android:orientation="vertical">

        <TextView
            android:id="@+id/title_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="标题"
            android:textColor="#333333"
            android:textSize="14sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/content_tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:text="aaaaaaaaaaaaaaaaaaa。。。。aaaaaaaaa"
            android:textColor="#999999"
            android:textSize="14sp" />

    </LinearLayout>

</LinearLayout>

4.添加适配器

class RcAdapter(var context: Context) : RecyclerView.Adapter<RcAdapter.Holder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val inflate = from(context).inflate(R.layout.xingfa_rc_item, parent, false)
        return Holder(inflate)
    }

    override fun getItemCount(): Int {
        //模拟60条数据
        return 60
    }

    override fun onBindViewHolder(holder: Holder, position: Int) {
        holder.fazhiTest.text = "法制理念"
        holder.countTest.text = "0/4"
    }

    class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val fazhiTest: TextView = itemView.fa_zhi_tv
        val countTest: TextView = itemView.count_tv
    }
}

5.初始化布局

private fun initView() {
        //线性布局管理器
        inflate.rc_data.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false)
        //网格布局管理器
        inflate.rc_data.layoutManager = GridLayoutManager(activity,2)
        inflate.rc_data.adapter = RcAdapter(activity)
    }

三、原理分析

1.适配器思想

RecyclerView使用适配器模式,将用户界面展示与交互分离,其中主要有三个方法:

  • getItemCount:获取列表项的数目。
  • onCreateViewHolder:创建整个布局的视图持有者。输入参数中包括视图类型,可根据视图类型加载不同的布局,从而实现带头部的列表布局。
  • onBindViewHolder:绑定每项的视图持有者。

2.复用思想和回收策略

  • 第一屏加载:手机—>回收池(null)—>onCreateViewHolder()—>适配器view—>手机

  • 第二屏加载:手机上滑,底部空缺触发加载—>回收池找到view—>onBindViewHolder()—>适配器刷新—>重新添加进view中

  • 回收池回收策略:达到回收条件view,getViewType()—>根据type值,加入到回收池中,使用时则移出回收池返回给RecyclerView层

3.组件关系

RecyclerView中各个组件间的关联关系:

  • RecyclerView——>viewHolder(view)<—>Adapter—>Datas
  • RecyclerView—>layoutManager(加载布局)—>Recycler(回收池,管理view)—>viewHolder

由上面关联可知:RecyclerView只会和viewHolder进行接触,Adapter将data转化为viewHolder

RecyclerView还将自己作为View的 onMeasure()、onLayout()直接交给LayoutManager,onDraw()交给了ItemDecoration来绘制,引入了ItemAnimator来添加动画效果

4.缓存机制

RecyclerView是通过内部类Recycler来管理缓存(四级缓存)

  • 一级:屏幕内缓存
  • 二级:屏幕外缓存
  • 三级:自定义缓存
  • 四级:缓存池

缓存策略:Recyclerview在获取ViewHolder时按四级缓存的顺序查找,如果没找到就创建。其中只有RecycledViewPool找到时才会调用 onBindViewHolder,其它缓存不会重新bindViewHolder

四、ListView缺点

无动画,缓存(listView有两级)

安卓RecyclerView和Adapter 阅读详情

相关推荐

RecyclerView实现吸顶效果项目实战(四):RecyclerView原理解析

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习。很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习。最后,如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

goodhighting的博客 653

RecyclerView详解

RecyclerView 简称 RV, 是作为 ListView 和 GridView 的加强版出现的,目的是在有限的屏幕之上展示大量的内容,因此 RecyclerView 的复用机制的实现是它的一个核心部分。 RV 常规使用方式如下: 解释说明。 setLayoutManager:必选项,设置 RV 的布局管理器,决定 RV 的显示风格。常用的有线性布局管理器(LinearLayoutManager)、网格布局管理器(GridLayoutManager)、瀑布流布局管理器(StaggeredGr

Android 4万+

博客《RecyclerView系列之三自定义LayoutManager》对应源码

博客《自定义控件三部曲视图篇(六)——RecyclerView系列之三自定义LayoutManager》对应源码,博客地址:https://blog.youkuaiyun.com/harvic880925/article/details/84789602

Android基础——RecyclerView

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

松仔Log的博客 1万+

SAP固定资产原值与净值取值逻辑全解析:从数据表到ABAP实战

在企业资源计划(ERP)系统中,固定资产的价值管理是财务会计的核心模块,其关键在于准确核算资产原值与净值。从技术原理上看,这涉及对资产全生命周期业务(如购置、折旧、转移、报废)的财务建模,以及底层数据表(如ANLC、ANEP)的精准关联与计算。掌握这一逻辑的技术价值在于,能够确保财务报表数据的准确性,满足合规性要求,并为管理决策提供可靠依据。在SAP ECC或S/4HANA系统的应用场景中,ABAP开发者与财务顾问常需通过编写报表程序,从复杂的数据结构中提取资产价值信息。本文聚焦于SAP资产会计模块,深入剖

weixin_30984001的博客 392

2025小红书跳转卡片实战指南:从零搭建独立后台与自动化发卡系统

本文提供了一份2025年小红书跳转卡片的实战搭建指南,详细解析了独立后台系统的核心架构与自动化发卡流程。文章从零开始,手把手教你使用Node.js、Vue.js等技术栈构建包含后台管理、用户制卡中心与前端交互的完整系统,旨在帮助运营者实现合规引流,并掌握数据自主权与自动化运营能力。

weixin_29234423的博客 517

RecyclerView原理解析

转载请注明:https://blog.youkuaiyun.com/feather_wch/article/details/79932523 参考和学习资料 自定义LayoutManager RecyclerView绘制流程解析 LinearLayoutManager填充、测量、布局过程 掌握自定义LayoutManager(一) 系列开篇 常见误区、问题、注意事项,常用API 把RecyclerV...

feather(猎羽) 1958

SCI论文Discussion写作:如何用AI工具三步打造审稿人认可的深度逻辑框架

本文针对SCI论文Discussion写作的痛点,提出利用AI工具三步构建深度逻辑框架的方法。首先,使用Claude等工具搭建个性化提纲,解决“浅显病”与“混乱症”;其次,高效整合文献与结果,填充证据;最后,优化逻辑衔接与学术语言,打造审稿人认可的流畅论证。该方法强调研究者主导,AI辅助,显著提升写作效率与深度。

weixin_28235513的博客 235

Android RecyclerView 原理解析

Android RecyclerView 原理解析一.模块分析1.列表控件2.LayoutManager3.Recycler回收机制二.View布局流程分析1.LinearLayoutManager的onLayoutChildren()方法2.fill()方法3.recycleByLayoutState()4.layoutChunk()三.滚动时view的展示与复用1.拖动滚动2.Fling滚动3...

依生依世 3969

【异常】XXL-JOB提示异常ERROR com.xxl.job.core.util.XxlJobRemotingUtil - connect timed out

打开XXL-JOB的ELK,发现一堆报错。

奶爸的编程之路,也就一周冷个三天 2046

Python re库【正则表达式操作库】全面讲解及代码示例

以下是Pythonre库的全面讲解,包含主要功能、常用方法及代码示例。完整代码和注释附后。正则表达式(Regular Expression)是用于匹配、查找、替换字符串的工具,通过特定语法定义模式。?{n}[...][a-z]A|B\d[0-9]\D\s\S\w\Wre从字符串匹配模式,返回Match对象或None。在字符串中第一个匹配项,返回Match对象或None。返回所有匹配项的。返回所有匹配项的Match对象)。替换匹配项,返回新字符串。根据模式分割字符串,返回列表。通过。

记录点滴 1161

基于滑动场景解析RecyclerView的回收复用机制原理

基于滑动场景解析RecyclerView的回收复用机制原理

qq_33635618的博客 206

基于STM32的录音机设计(STM32F103+VS1053B)

本项目设计并实现了一款基于STM32微控制器的便携式录音机。该录音机采用STM32F103C8T6作为主控芯片,结合VS1053B音频编解码模块、SD卡存储、OLED显示屏以及按键模块,提供了手动录音、自动录音和录音回放等多种功能。

1万+

RecyclerView 的常用方法;工作原理与ListView比较;源码解析

写在前面 本文原创,转载请以链接形式注明地址:http://kymjs.com/code/2016/07/10/01 起深入浅出这名字的时候我是慎重又慎重的,生怕被人骂标题党,写的什么破玩意还敢说深入浅出。所以还是请大家不要抱着太高的期望,因为没有期望就没有失望,就像陈润说的,超预期嘛。全当看小说的心情来看这系列文章了。 这篇文章分三个部分,简单跟大家讲一下 RecyclerView

ykrank的博客 2594

CONN工具箱分析fmri数据笔记1

前言一、安装二、预处理三、去噪 前言 CONN:functional connectivity toolbox,是基于MATLAB和SPM的一个对功能磁共振数据进行分析的一个工具箱。可以进行以下分析: Seed-based correlations (SBC), ROI-to-ROI correlations, graph analyses, Independent component analyses(group-ICA), Masked (ICA) Amplitude of Low-Frequency.

weixin_52073820的博客 6585

js逆向第3例:蝉妈妈大屏实时数据formDataSign加密

蝉妈妈大屏抖音直播实时数据是抓取抖音直播间数据的实时数据,有类似需求的公司但没有能力去搞定抖音,抓取蝉妈妈数据也是一个不错的选择。接下来就是调试找到加密点,说句题外话蝉妈妈的所有js文件打包方式用的都是webpack5,那如何区分打包方式可以阅读这篇文章。时间戳 ,经过观察发现加密参数是实时变化的。这个函数扣下来,在浏览器控制台中测试一下。言归正传,打断点找到变量。继续打断点向上找又发现了。查看请求参数,可以看到。请求的内容,那么这个。

花臂不花Home 1539

深度探秘!Android RecyclerView 缓存机制的底层原理全解析

RecyclerView 的缓存机制是其高性能的关键所在。通过四级缓存(和)的协同工作,RecyclerView 可以高效地复用视图,减少视图的创建和销毁次数,从而提高列表滚动的流畅性和性能。在数据更新时,缓存机制也能根据不同的更新操作进行相应的处理,确保显示的内容与数据一致。同时,通过合理设置缓存大小、优化视图创建和绑定逻辑、利用预取机制和避免不必要的刷新等性能优化方法,可以进一步提升 RecyclerView 的性能。

Android开发领域创作者 2604

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

使用 EMQX 规则引擎新事件 `$events/client/ping` 监控 MQTT 客户端心跳(PINGREQ)

> 本文依据 [changes/ee/feat-16099.en.md](https://link.gitcode.com/i/5267b2d232f1292fcc9c3fb7c1cb2c34) 中的功能说明展开,结合 EMQX 开源仓库中规则引擎与 MQTT 连接层源码,完整讲解 `$events/client/ping` 事件的触发时机、可用字段、底层实现链路与实战配置方法。读完本文,你将能够

gitblog_00179的博客 347

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【源码解析】RecyclerView的工作原理

Running&H的博客 306

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

RecyclerViewPager源码解析:从RecyclerView到ViewPager的实现原理

RecyclerViewPager是一个创新的Android组件,它巧妙地将RecyclerView的高效回收机制与ViewPager的滑动切换特性结合起来,为开发者提供了一种高性能的页面切换解决方案。通过深入分析其源码实现,我们可以清晰地看到如何通过自定义RecyclerView来模拟ViewPager的核心功能。 ## 核心实现:RecyclerViewPager类架构 RecyclerV

gitblog_01085的博客 856

PinnedSectionItemDecoration源码解析:揭秘RecyclerView粘性头部实现原理

PinnedSectionItemDecoration是一个功能强大的RecyclerView ItemDecoration库,支持多种常见布局管理器,能帮助开发者轻松实现列表粘性头部效果。本文将深入解析其核心实现原理,带你了解粘性头部背后的技术细节。 ## 粘性头部效果展示 粘性头部是移动应用中常见的UI效果,它能在列表滚动时将分类标题固定在顶部,提升用户体验。PinnedSectionIt

gitblog_01012的博客 459

Horizontal-Calendar源码解析:RecyclerView实现横向日历的核心原理

Horizontal-Calendar是一个基于RecyclerView实现的Android横向日历组件,它提供了流畅的滑动体验和灵活的日期选择功能。本文将深入剖析其核心实现原理,帮助开发者理解如何利用RecyclerView打造高性能的横向滚动日历。 ## 横向日历的视觉呈现与交互设计 Horizontal-Calendar的核心视觉特征是水平排列的日期选择条,用户可以左右滑动切换日期,点击

gitblog_00319的博客 453

基于场景解析RecyclerView的回收复用机制原理

本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 最近在研究 RecyclerView 的回收复用机制,顺便记录一下。我们知道,RecyclerView 在 layout 子 View 时,都通过回收复用机制来管理。网上关于回收复用机制的分析讲解的文章也有一大堆了,分析得也都很详细,什么四级缓存啊,先去 mChangedScrap 取再去哪里取啊之类的;但其实,我想说的是,R...

weixin_30950237的博客 1340
上一篇: synchronized锁原理详解
下一篇: Glide使用及原理分析
浮空over
博客等级 码龄7年 6粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值