一、介绍
在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总结和认识,我们可以在很多场景下没必要去额外的开销系统。需要做什么,直接定位到问题,不要做宁啥一千,也不错放一个。只有定位都问题,这样才会降低系统的开销。
往往不起眼的东西,会引起大的问题,只有我们足够的细心去查看源码,才能真正提升个人能力。