Recyclerview 复用之headview优化

滑动冲突学习实例——头部可折叠的RecyclerView 背景:最近在学习android的事件分发和滑动冲突的解决,所以做了一个头部可折叠的RecyclerView(其实Google的官方控件已经实现了类似的效果,而且还挺好看的),由于对这部分的知识了解得很浅,所以遇到了不少困难。不多说,直接上图。 实现的大致想法:头部的View(下面都称为HeadView)和RecyclerView放在一个FrameLayout中。HeadView在底层,Recycl 阅读详情

版本:support-v7 25.3.1

发现问题

在对 性能优化-首页CPU占用优化 调研时发现,首页的OnCreateViewHolder存在高频次调用的情况,而常见的开源列表组件不存在此问题。

遂针对此问题,对recyclerview的复用机制进行分析。

缓存集合

1 mChangedScrap 表示数据已经改变的ViewHolder集合

image.png

2 mAttachedScrap 与RecyclerView尚未分离的ViewHolder集合

3 mCachedViews ViewHolder缓存集合,默认为2。

4 mViewCacheExtension 开发者可自定义集合

5 mRecyclerPool ViewHolder缓存池。 被用来做下一级的缓存。默认最大为五个。

image.png

缓存复用流程

从onCreateViewHolder的调用开始看

image.png

tryGetViewHolderForPositionByDeadline方法,也是复用机制的重点。

这是一个自带过期时间的view复用函数,返回的对象如果时间不允许,那么可能会是null或者未绑定的。

dryRun 控制使用完缓存之后,是否需要从缓存中删除。

image.png

1 从被改变的废料中获取组件

如果这里是一个改变了的废料,那么使用getChangedScrapViewForPosition函数去获取。

// 0) If there is a changed scrap, try to find from there

image.png

来看具体的实现方法,

ViewHolder getChangedScrapViewForPosition(int position)

image.png

2 根据 position 从已经改变的废料集合中搜索缓存

如果成功,则打回。 第二步 根据id查询废料缓存。

3 从隐藏或者缓存的组件集合中获取 根据posotion

getScrapOrHiddenOrCachedHolderForPosition // 1) Find by position from scrap/hidden list/cache

image.png

这里做了两件事情,第一个从缓存列表中获取holder,然后在验证其有效性。

其实这里的getScrapOrHiddenOrCachedHolderForPosition 方法是缓存的重点功能实现。

image.png

4 从隐藏和缓存组件集合中获取,根据ids

image.png

从自定义的扩展中读取缓存

略,项目中未使用此功能。

从RecyclerPool读取缓存

这级别的是一个根据view type 进行缓存的SparseArray对象。

image.png

收获

1) 加深了对RecyclerView 缓存机制的理解

2) 问题定位: 

项目中的headview的高度比itemview的高度,高出很多倍。 所以在 当head view被回收的时候,缓存中的itemview数量不足以复用,导致多次调用手动实例化方法。

3) 优化建议:

使用了headview的情况下,建议head view的高度不要比正常的item高度超过太多。 

这样可以使item的使用完全可以通过缓存消化,避免频繁的手动实例布局文件。

Linux磁盘扩容实战:用parted命令无损扩展/data分区(附常见报错解决方案) 本文详细介绍了在Linux生产环境中使用parted命令对已挂载的/data分区进行在线磁盘扩容的完整实战流程。通过风险评估、状态检查、parted工具深度解析及实战演练,指导用户安全完成动态扩容,并提供了常见报错如'Partition is being used'、MBR 2TB限制等的解决方案,确保业务不中断、数据不丢失。 阅读详情

相关推荐

Three.js 完整实战项目:构建一个 3D 商品展示空间

Three.js 作为强大的 WebGL 框架,广泛应用于交互式 3D 场景开发,尤其适合创建沉浸式商品展示空间。本文将通过一个完整的实战项目,展示如何构建一个 3D 商品展示空间,涵盖项目架构、资源组织、多模型切换、交互热点绑定、移动端适配和帧率优化。项目以展示虚拟商品(如家具或电子产品)为核心,结合用户交互,基于 Vite、TypeScript 和 Tailwind CSS,支持 ES Modules,确保响应式布局,遵循 WCAG 2.1 可访问性标准。本文适合希望通过综合项目掌握 Three.js

zimin的专栏 1426

Android RecyclerView添加FootView和HeadView

主要介绍了Android RecyclerView添加FootView和HeadView的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Android RecyclerView分组显示实战项目

标准的只能加固定间距,但我们想要的是:同一组内的 Item 紧凑排列不同组之间留出额外垂直间距解决方案:自定义) {: return} else {paint注册一下就搞定:需求分析:明确分组维度、交互规则、UI 参数数据建模:选择合适的嵌套结构,完成预处理视图编码:Adapter 多类型逻辑 + ViewHolder 封装布局调试:验证粘性头部、间距表现是否符合设计稿性能优化

weixin_42497762的博客 827

RecycleView添加headerView

这两日在写一个小东西,需要给RecycleView添加一个headerView(轮播图),总结一下吧 思路 在RecycleView的Adapter里面声明一个内部view变量 然后在CreatView方法里面判断位置,如果是position为0的话就代表加载的是第一个 那么就把我们事先声明的View放在这个位置 代码 public class RecycleViewAdapt...

小黄人的博客 1408

RecyclerView 添加HeadView

ListView为我们提供了addHeadView方法添加头部,RecyclerView没有该方法,下面我们来做这个工作。主要的思路还是根据getItemViewType的返回值加载不同的布局文件。 第一步:准备bean——AdaperParam,适配器需要的几个参数,如下 package com.dfsebook.myrecycleradapter.bean; import java.ut

hgwsywbj0102的专栏 1293

RecyclerView实现addHeadView的三种方法原理说明和利弊分析(footHead同理)

介绍上一篇博客我分析了ListView的源码看Google是怎么样实现addHeadView的,源码的思路是对绑定在ListView的Adapter做转换,在我们调用addHeadView的时候把已经写好的BaseAdapter转换成HeaderViewListAdapter这一组件,在代码内部调用BaseAdapter.getView方法。这样写的好处是解耦和不影响我们原有代码的前提下做好转换。这

李可乐的专栏 7108

设计思想培养:装饰者模式下的RecyclerView添加头、尾

一个高复用、低耦合的代码不会让你在第一次去实现代码的时候感到舒服但是他会在你后面做扩展、和同类需求的时候,直呼真香!!!最近写需求,借用到装饰者思想做了RecyclerView的头和尾的扩展感觉很不错,赶紧拿出来说一说,嘻嘻ps:本篇文章只是帮助大家,在实现需求的过程中也能潜移默化的使用设计模式来优化代码本篇呢,只是想说一下如何去潜移默化的使用设计模式去改变我们的代码。举了一个扩展RecyclerView头和尾的例子。

小孟来码的博客 573

万能的RecyclerViewAdapter,支持上拉加载、添加HeadView

最近的项目,使用RecyclerView比较多,导致需要写大量的Adapter和ViewHolder。不想偷懒的程序员不是好程序员。于是,查了一些资料,对RecyclerView的Adapter进行了一些封装。使用的时候减少了大量的工作。 先来点效果图 1.gif 2.gif 封装后的Adapter使用: class DragSwipeAdapter extends

努力,可能成功!放弃,注定失败! 1294

RecycleView简单使用

简介 基本使用流程 1.导包 2.设置布局管理器 3.设置Adapter 4. 添加分割线 5. 设置动画 6.点击事件 7.HeadView + FootView 7.去掉滑动收尾的下拉动画 复杂布局层数简化 1. 布局要求 2. 布局解析 3. 布局实现 4. 最终效果展示 简介 A flexible view for providing a limited ...

ffengz的博客 759

RecyclerView优化和使用场景

前言 最近写一个项目使用了嵌套RecycleView,但是加载完后,第一次滑动卡顿。找遍了所有的优化方案,很多方案只说了可以怎样怎样设置来进行优化,却没说什么场景下使用。特此总结汇总如下。先说我自己遇到的问题: getExtraLayoutSpace 使用场景:一个itemView就占了一屏大小的RecycleView 我是最外面一个竖排的RecycleView,然后内部的第二个item用了Gri...

BrainZou的博客 1738

2019上半年android项目中的性能优化

一 卡顿问题 1.1 ListView的ItemView中使用了getViewTreeObserver().addOnPreDrawListener 在实际生产中发现列表快速滑动的掉帧非常厉害,但是无论通过FPS的检测以及method profile的测量此时的主线程都不应该卡顿。后面通过分析发现该列表页面的itemView中有如下一种代码: viewHolder.textView....

u011386809的博客 352

面试题kkk

这篇文章摘要主要涵盖了Android开发中的核心知识点和技术难点,包括数据结构、Java与Kotlin语言特性、多线程与并发、内存管理、安卓组件与UI、IPC通信、数据库、多媒体处理、设计模式、性能优化、跨端开发等多个方面。文章详细解析了常见数据结构的使用与实现、JVM机制、内存泄漏分析与解决方案、Activity生命周期、事件分发机制、Handler原理、音视频处理、设计模式应用等核心内容,并提供了实际项目中的技术卡点与解决方案。此外,还涉及了性能优化策略、跨端开发差异、技术方案设计思路以及Git常用命令

mix39的博客 864

Android 优雅的为RecyclerView添加HeaderView和FooterView

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发。 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details...

孤云博客 2703

探究RecyclerView的ViewHolder复用

在用recyclerview的时候,发现其onCreateViewHolder方法,既不是调用了一次,也不是调用了item个数的次数。因而想看看,RecyclerView的ViewHolder复用。 网上找到了一篇好的文章。 文章转自:http://www.jianshu.com/p/d7ec36aa8e4b ViewHolder与复用 在复写RecyclerVie

qq_32165689的博客 5632

RecyclerView源码分析之二 滚动时候的ViewHolder的回收和复用

RecyclerView 使用线性布局,方向为竖直方向,布局从上到下。第一次设置 LayoutManager 和 Adapter ,正常显示数据以后,滚动 RecyclerView。**其他注意的点:**在调试过程中发现,GapWorker 的 prefetchPositionWithDeadline 方法干扰到 RecyclerView 的回收和复用过程。有时候会导致 导致 Recycler.mCachedViews的 size变成了3(默认是2)。这个不是主要流程,我们先忽略,有兴趣可以仔细研究研究。

leilifengxingmw的博客 1680

RecyclerView-的复用机制,终于搞明白了

public final class Recycler { final ArrayList mAttachedScrap = new ArrayList<>(); ArrayList mChangedScrap = null; final ArrayList<ViewHolder> mCachedViews = new ArrayList<>(); RecycledViewPool mRecyclerPool; private ViewCacheExtension m

m0_61417918的博客 797

RecyclerView从入门到入神—为RecyclerView添加HeaderView, FooterView和EmptyView(二)

RecyclerView从入门到入神—为RecyclerView添加HeaderView, FooterView和EmptyView(二)

weixin_42602900的博客 918

高级UI-RecyclerView头部和尾部添加

在ListView中,可以添加头部和尾部,其添加方法也是十分的简单,直接调用listview.addHeaderView(view);和listview.addFooterView(view);即可,但在RecyclerView中却没有这样的方法,那么要在RecyclerView中使用这种方法怎么办呢,这就是本文要讲明的地方 原理 查看ListView源代码,得知其头部和尾部,实质上就是对原来的a...

cj5785 4018

RecyclerView复用机制和缓存机制

RecyclerView复用机制流程

xuyin1204的博客 1957

RecyclerView的ViewHolder复用错乱问题处理

关于RecyclerView复用错乱问题的处理方法网上大部分是以下几种 1.最简单直接的方法ViewHolder不可复用(尽量不要使用此方法) viewHolder.setIsRecyclable(false) 2.在onBindViewHolder里给View设置展示前,都需要将当前View的状态置为初始状态,其中if里设置的一定要在else里还原。(注意此处的item为数据模型的字段,尽量使用数据模型内字段来区分要展示) if(item.isChecked){ textView.s.

Yvan 3973

sm2+openssl.zip 使用C++实现的openssl调用sm2实现文件签名的功能 C++源代代码可以直接使用

原文链接:https://qihongtao.blog.csdn.net/article/details/134978662?spm=1001.2014.3001.5502sm2+openssl.zip 使用C++实现的openssl调用sm2实现文件签名的功能。 C++源代代码可以直接使用。也上传了openssl1.1.1的头文件、lib文件和dll文件。因为国产化原因,项目中需要使用国标sm2签名算法对文件进行签名和验签。OpenSSL 1.1.1版本提供了对国密SM2算法的支持,在之前的版本openssl不支持。关注公众号 QTShared,后台私信留言免费获取。

上一篇: 使用ScheduledThreadPoolExecutor 替代 Timer
下一篇: 【阿里面试题】BroadcastReceiver 不能执行耗时操作
打打卡夫卡
博客等级 码龄14年 144粉丝 37原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值