Android 适配器Adapter全面认识notify介绍与使用

一、介绍

在Android开发过程中,Recycleview和Viewpager2使用的评率相对比较高。都是通过数据生成view,然后对view和数据的绑定与更新。常见的开发模式就是适配器。

过于频繁的更新,适配会造成资源额外的开销,如果我们能更好运用这些适配器,可以事半功倍,必然提升用户体验,降低字资源消耗

二、Adapter的notify

在android中,Adapter是通过notify通知出去的,接下来我们将以Recycleview的adapter提供的几种通知事件进行解刨。

1.notifyItemRemoved(int position)

移除item,如果你删除哪个数据源,可以直接移除出去 ,移除完直接回更新视图,无法全部刷新,移除最好把数据页删了,否则就是假移除,因为不删除,后面会被还原出来

2.notifyItemMoved(int fromPosition, int toPosition)

移除的区间,从索引多少到多少。可以参考第一个。下标一般是从0开始

3.notifyDataSetChanged

全局刷新,一般在第一次添加数据调用可以,如果已有,再调用就不礼貌了。但是,在开发过程中,好多小项目一直在这么调用,原因是数据量少,如果是大型头部项目,一般不会这么干的,因为调用会从头到尾检索一次,非常耗时。

大型项目一个页面复杂的数据可以通过一个recycleview就可以完成,所以在优化recycleview时,一定会检测这方面的问题

4.notifyItemInserted(int position)

数据的插入,一般要确定adapter的数据源插入在哪个位置,这个位置一定要和数据源保持一致,否则不生效

5. notifyItemRangeChanged(int positionStart, int itemCount)

数据更新,一般数据源发生变化,需要对数据的更新和操作,有两个参数,一个是开始的下标,还有一个是需要连续更新多少个,这个是连续的,不可以跳跃更新。

6.notifyItemRangeChanged(int positionStart, int itemCount, @Nullable Object payload)

数据更新,这个更新和第五个是同样的,但是多了一个参数。一般小伙伴没用过payload。这个和我们开发习惯有关。因为好多人在Adapter重写是这个

java 复制代码
 public abstract void onBindViewHolder(@NonNull VH holder, int position);

但是,Adapter里面还有一个方法,

java 复制代码
    public void onBindViewHolder(@NonNull VH holder, int position,
                @NonNull List<Object> payloads) {
            onBindViewHolder(holder, position);
        }

这个方法是调用了上面的抽象方法,也就是我们常用的bindViewHolder。但是这个方法里多了一个payloads。

这个payloads到底有什么用?

其实这个类似一个标签类,比如我们有个字段需要更新,需要暂时播放音乐或者恢复播放,就可以定义一个数组,通过本次更新单独要做什么操作。

Kotlin 复制代码
    override fun onBindViewHolder(holder: MyViewHolder, position: Int, payloads: MutableList<Any>) {
        super.onBindViewHolder(holder, position, payloads)
  
        payloads?.forEach {
            when (it) {
                1 -> {
                //更新某个行为
                }

                "load" -> {

                }

                "playvideo" -> {

                }
            }
        }

    }

7.notifyItemChanged(int position)

更新,参考第六个,这个是简版,数据发生变更,直接调用即可,传入要更新的试图下标,更新也是调用第六个,其他传的都是1和null

8.notifyItemChanged(int position, @Nullable Object payload)

更新,参考第六和第七,不再过多叙说,不然就不礼貌了。

9.notifyItemRangeInserted(int positionStart, int itemCount)

连续插入,也是先改变数据源,找到插入的位置,和需要更新连续的长度。比如,这个也可以和change替代。正常我们新插入的数据,可以通过这个来完成。

三、总结

通过对Adapter的notify总结和认识,我们可以在很多场景下没必要去额外的开销系统。需要做什么,直接定位到问题,不要做宁啥一千,也不错放一个。只有定位都问题,这样才会降低系统的开销。

往往不起眼的东西,会引起大的问题,只有我们足够的细心去查看源码,才能真正提升个人能力。

虽然经济不景气,好多同行被裁员,最后祝大家都能找到工作。

相关推荐
yueqc11 分钟前
Kotlin 协程 Flow 操作符总结
kotlin·协程·flow
fanged2 小时前
天马G前端的使用
android·游戏
molong9316 小时前
Kotlin 内联函数、高阶函数、扩展函数
android·开发语言·kotlin
叶辞树7 小时前
Android framework调试和AMS等服务调试
android
慕伏白9 小时前
【慕伏白】Android Studio 无线调试配置
android·ide·android studio
低调小一10 小时前
Kuikly 小白拆解系列 · 第1篇|两棵树直调(Kotlin 构建与原生承载)
android·开发语言·kotlin
跟着珅聪学java10 小时前
spring boot 整合 activiti 教程
android·java·spring
川石课堂软件测试11 小时前
全链路Controller压测负载均衡
android·运维·开发语言·python·mysql·adb·负载均衡
2501_9159214312 小时前
iOS 26 电耗监测与优化,耗电问题实战 + 多工具 辅助策略
android·macos·ios·小程序·uni-app·cocoa·iphone
2501_9159214312 小时前
苹果软件混淆与 iOS 应用加固白皮书,IPA 文件加密、反编译防护与无源码混淆方案全解析
android·ios·小程序·https·uni-app·iphone·webview