使用 Payload 提高 RecyclerView 渲染效率

九路 等级 523 1 1

RecyclerView.Adapter 中有个带有 payloads 参数的函数,由于这个函数不是抽象函数,被很多人忽略了。该函数定义如下:

public void onBindViewHolder(VH holder, int position, List<Object> payloads) {
    onBindViewHolder(holder, position);
}

该函数的默认实现会调用 onBindViewHolder(holder, position) 这个抽象函数。

这个 payloads 参数是一个 List 对象,该对象不是 null 但可能是 空的。通过 Adapter 的 notifyXXX 函数的带有 payload 参数的函数可以设置 payload 对象,例如通知一个条目数据变化的函数:

public final void notifyItemChanged(int position, Object payload) {
    mObservable.notifyItemRangeChanged(position, 1, payload);
}

下面来看看这个 payload 是干什么的。

如果没有 payload , 当调用 notifyItemChanged 的时候, RecyclerView 会通过回调 onBindViewHolder(holder, position) 来更新当前数据变化的 View,但是对于比较复杂的条目,里面有很多个不同的控件,比如有图片、文字、CheckBox 等,用户点击一下当前条目(比如 喜欢一个微博信息),需要把喜欢的状态高亮。 也就是说,当前一个微博条目中只有一个喜欢状态的变化,但是需要重新在 onBindViewHolder(holder, position) 中设置所有View 的内容。对于每个 View ,当设置其内容的时候,都会触发 View 的重新布局和计算位置,这样至少一个 View 状态变化了 最终导致整个条目都需要重新布局一遍。

如果通过 payload 来告诉系统这个微博消息只有喜欢状态变化了,这样在调用 onBindViewHolder(VH holder, int position, List payloads) 函数中的 payloads 就包含了你指定的数据。然后你可以在这里只修改变化过的 View,其他 View 不用修改。从而可以提高 RecyclerView 的渲染效率。

需要注意的是,当 payloads 为 空的时候,说明是该条目的整个数据都变化了, 需要更新所有的数据,所以你可以在当 payloads 为 空 的时候调用不带 payloads 参数的函数,如下:

@Override
public void onBindViewHolder(ViewHolder holder, int position, List<Object> payloads) {
    if (payloads.isEmpty()) {
        // payloads 为 空,说明是更新整个 ViewHolder 
        onBindViewHolder(holder, position);
    } else {
        // payloads 不为空,这只更新需要更新的 View 即可。
            holder.mBadgeView.setVisibility(((Item)payloads.get(0)).disabled ? View.VISIBLE : View.INVISIBLE);
        }
    }
收藏
评论区

相关推荐

使用 Payload 提高 RecyclerView 渲染效率
RecyclerView.Adapter 中有个带有 payloads 参数的函数,由于这个函数不是抽象函数,被很多人忽略了。该函数定义如下: public void onBindViewHolder(VH holder, int position, List<Object payloads) { onBindViewHolder(holder,
RecyclerView之ItemDecoration使用教程
译文的GitHub地址:RecyclerView之ItemDecoration由浅入深(https://link.jianshu.com?thttps://github.com/thinkSky1206/androidblog/blob/master/RecyclerView%E4%B9%8BItemDecoration%E7%94%B1%E6%B5
Android RecyclerView如何获取滑动距离
获取RecyclerView滑动的距离。 本文演示如何获取RecyclerView的滑动距离。 要实现这个功能,需要给RecyclerView添加滑动时监听RecyclerView.OnScrollListener。 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListene
完美解决Android RyclerView嵌套滑动事件冲突
在Android项目开发中,为了实现需求和兼并用户体验,相信很多人都碰到滑动事件冲突的问题。在Android系统中事件分发机制是一个很重要的组成部分,由于这事件分发机制不是本文重点,故不在此多述,如果有想详细了解的可以自己搜下,网上有很多相关资料详细描述了Android事件分发机制。 一、问题场景 由于RecyclerView自身的优点,使得它已经基本
前端 后端的区别
前台:眼睛看到的东西 关乎体验感。 后台:给管理人看的玩意 前端:程序员在进行编程的时候的代码编写。 后端:对应前端而言的,编写代码基本上是提供给前端调用,是不需要处理UI的内容.
干货|详解位图算法在Android RecyclerView中的应用
1. 前言 1.1 关于算法金庸武侠小说中的主人公在成为绝世高手之前,都会学习一门玄门内功。郭靖有了全真派的内功才能修炼九阴真经、虚竹得到了无崖子的毕生功力后,武学造诣日渐精进、张无忌苦练五年九阳神功,日后才能融合乾坤大挪移。对于程序员,算法就是小说中的内功,编程语言就是不同门派的武功。张无忌因为有九阳神功加持仅用一天就学会了阳顶天几十年都学不成的乾
RecyclerView基础用法
是一款非常强大的 widget,它可以帮助您灵活地显示列表数据。当我开始学习 RecyclerView 的时候,我发现对于复杂的列表界面有很多资源可以参考,但是对于简单的列表展现就鲜有可参考的资源了。虽然 RecyclerView 的组成结构乍一看有些复杂,但是深入理解以后您会发现它其实非常简单明了。本文会通过创建一个简单的 RecyclerView 实现一
2021涅普冬令营笔记——web
写在前面 老 web 🐕了 课程大纲 2021.2.6——黑客竟在我身边 Burpsuite 功能介绍 安装+ 百度、csdn 都有教程,跳过 proxy模块+ 代理模块,相当于在客户端和服务端中间的一个关卡,可以拦截、修改、丢弃所有的流量包 intruder模块+ 用来爆破的模块 Target Positions Payloads+ Payload Set
每日一题(五)
写在前面继续努力 [CISCN2019 华东南赛区]Double Secret进来一句话,做题全靠猜web 题,直接去/secret目录这句话提到了发送 secret 过去,会有 encrypt加密,get 一个 secretadmin123过去直接进报错,又是 flask发现可疑的源码泄露点pythonif(secretNone): return '
每日一题(六)
写在前面 冲冲冲! [ASIS 2019]Unicorn shop进去是一个买独角兽的页面,但是找不到自己有多少钱???前三个独角兽很便宜,就几块钱,肯定不是 flag ,买最贵的独角兽时,回显了一句Only one char(?) allowed!,只能输入一个字符,然而最贵的独角兽要 1337 块回显报错源码中有两句注释因为那句We still have
RecyclerView更全解析之 - 基本使用和分割线解析
1.概述 昨天跟自己群里的人唠嗑的时候发现还有人在用Eclipse,我相信可能还是有很多人在用ListView,这里介绍一个已经出来的n年了的控件RecyclerView,实现ListView,GridView,瀑布流的效果。还可以轻松的实现一些复杂的功能,如QQ的拖动排序,侧滑删除等等。相关文章:                     
RecyclerView更全解析之 - 打造通用的万能Adapter
1.概述 离春节只有一个月,同时也在准备公司的节目所以每天有一段时间在练习吉他,刚刚群里有人问我什么时候开始分享仿内涵段子整个项目。算一下时间RecyclerView可能有4期左右的分享,自己又只能周末录讲解视频,所有可能会要等过完春节才能全部开始。   上一篇已经简单的讲解了一下。这一期我们来看一下怎么去打造一个万能的RecyclerView.Adap
RecyclerView更全解析之 - 打造通用的下拉刷新上拉加载
1.概述 这期我们在上一期的的基础上再去增加功能,我相信我们在真正的实践开发过程中肯定少不了下拉刷新和上拉加载。   我们需要思考一个问题上拉刷新下拉加载风格各式各样,淘宝和京东的列表刷新样式就肯定不一样,我们怎么样做到版本迭代的时候可以快速的更改样式。有时还需要显示正在加载数据或者无数据,比如筛选的时候有可能会出现没有数据的情况会显示无数据页面,怎么快
RecyclerView更全解析之 - 仿支付宝侧滑删除和拖动排序
1.概述 这是春节前的最后一篇分享技术的博客了,接下来的时间需要去完善视频讲解,至于今年都干了哪些事有什么成就吹牛的这里就不多说了,声明一下图片资源我是盗用的别人的。这是最后一期分享RecyclerView了,我们直接看这一期需要分享的效果:      这里写图片描述         视频讲解:相关文章:               
RecyclerView更全解析之 - 为它优雅的添加头部和底部
1.概述 上一期的,解决了几个坑。那么这一期我们来动态为RecyclerView去加载头部和底部,为上一期的RecyclerView列表数据添加广告轮播图,至于广告轮播大家可以看一下这一期 ,这里我就不多讲了,直接拿过来用。      视频讲解:相关文章: