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

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

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

相关推荐
帅得不敢出门9 分钟前
Gradle命令编译Android Studio工程项目并签名
android·ide·android studio·gradlew
小白学大数据44 分钟前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin
problc1 小时前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
帅得不敢出门11 小时前
安卓设备adb执行AT指令控制电话卡
android·adb·sim卡·at指令·电话卡
我又来搬代码了13 小时前
【Android】使用productFlavors构建多个变体
android
德育处主任14 小时前
Mac和安卓手机互传文件(ADB)
android·macos
芦半山14 小时前
Android“引用们”的底层原理
android·java
迃-幵15 小时前
力扣:225 用队列实现栈
android·javascript·leetcode
大风起兮云飞扬丶15 小时前
Android——从相机/相册获取图片
android
Rverdoser16 小时前
Android Studio 多工程公用module引用
android·ide·android studio