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重写是这个

 public abstract void onBindViewHolder(@NonNull VH holder, int position);

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

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

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

这个payloads到底有什么用?

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值