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

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

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

相关推荐
sun0077007 小时前
android ndk编译valgrind
android
AI视觉网奇8 小时前
android studio 断点无效
android·ide·android studio
jiaxi的天空8 小时前
android studio gradle 访问不了
android·ide·android studio
No Silver Bullet9 小时前
android组包时会把从maven私服获取的包下载到本地吗
android
catchadmin9 小时前
PHP serialize 序列化完全指南
android·开发语言·php
tangweiguo0305198711 小时前
Kable使用指南:Android BLE开发的现代化解决方案
android·kotlin
00后程序员张13 小时前
iOS App 混淆与资源保护:iOS配置文件加密、ipa文件安全、代码与多媒体资源防护全流程指南
android·安全·ios·小程序·uni-app·cocoa·iphone
柳岸风15 小时前
Android Studio Meerkat | 2024.3.1 Gradle Tasks不展示
android·ide·android studio
编程乐学15 小时前
安卓原创--基于 Android 开发的菜单管理系统
android
whatever who cares17 小时前
android中ViewModel 和 onSaveInstanceState 的最佳使用方法
android