使用 Payload 提高 RecyclerView 渲染效率

九路 等级 864 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自身的优点,使得它已经基本
RecyclerView基础用法
是一款非常强大的 widget,它可以帮助您灵活地显示列表数据。当我开始学习 RecyclerView 的时候,我发现对于复杂的列表界面有很多资源可以参考,但是对于简单的列表展现就鲜有可参考的资源了。虽然 RecyclerView 的组成结构乍一看有些复杂,但是深入理解以后您会发现它其实非常简单明了。本文会通过创建一个简单的 RecyclerView 实现一
2021涅普冬令营笔记——web
写在前面 老 web 🐕了 课程大纲 2021.2.6——黑客竟在我身边 Burpsuite 功能介绍 安装+ 百度、csdn 都有教程,跳过 proxy模块+ 代理模块,相当于在客户端和服务端中间的一个关卡,可以拦截、修改、丢弃所有的流量包 intruder模块+ 用来爆破的模块 Target Positions Payloads+ Payload Set
RecyclerView更全解析之 - 为它优雅的添加头部和底部
1.概述 上一期的,解决了几个坑。那么这一期我们来动态为RecyclerView去加载头部和底部,为上一期的RecyclerView列表数据添加广告轮播图,至于广告轮播大家可以看一下这一期 ,这里我就不多讲了,直接拿过来用。      视频讲解:相关文章:                                    
20155201 网络攻防技术 实验五 MSF基础应用
20155201 网络攻防技术 实验五 MSF基础应用 =========================== 一、实践内容 ------ * 一个主动攻击实践,如ms08\_067 * 一个针对浏览器的攻击,如ms11\_050 * 一个针对客户端的攻击,如Adobe * 成功应用任何一个辅助模块 二、报告内容: ------- #
java接收http请求body中的json数据
一般情况下,web应用中,浏览器发送http请求,传参数的时候都是作为param传递的,java服务端通过`request.getParameter(name)`可以获取参数内容; 但是会有一些场景,把参数放在了http的payload中(contentType:”application/json”),这时,使用getParameter就获取不到了, 比如
update_engine
在update\_engine-DownloadAction(一)中对DownloadAction介绍到了DeltaPerformer的Write方法。下面开始介绍Write方法。 **src/system/update\_engine/payload\_consumer/delta\_performer.cc** 1 bool DeltaP
Android 解决NestedScrollView 嵌套 RecyclerView出现的卡顿,上拉刷新无效
解决卡顿的方法最简单的就是设置RecyclerView的android:nestedScrollingEnabled="false",放弃自己的滑动,交给外部的NestedScrollView处理,就没有出现卡顿的现象了 至于RecyclerView的上拉刷新,可以监听NestedScrollView的滑动监听,具体代码如下: mNestedSc
Cobalt Strike生成后门
Cobalt Strike生成后门 ================= 1、Payload概念 ----------- Payload在渗透测试之中大家可以简单地理解为一段漏洞利用/植入后门的代码或程序。 2、Cobalt Strike生成后门 ------------------- 攻击-->生成后门 ![](https://oscimg.osch
RecyclerView实现倒序列表
RecyclerView实现倒序列表 ================== 标签(空格分隔): android RecyclerView 倒序 * * * ##1、写在前面 实现一个聊天界面,就是类似QQ那种,这里是讲一下倒序排列,不实现QQ的各种高级功能 ##2、ListView 反转数据 只要把数据倒序加入到adapter的数据集中,就可以实现倒
SQL注入 payload 记录
使用 REGEXP盲注 =========== payload ------- select user() from users where user_id=1 and (select(user)from users where user_id=1) REGEXP "^adm.*"; 来源 -- https://www.se
SQL注入 payload 记录
使用 REGEXP盲注 =========== payload ------- select user() from users where user_id=1 and (select(user)from users where user_id=1) REGEXP "^adm.*"; 来源 -- https://www.se