引言:iOS和Android各有自己的列表组件。众所周知,列表组件一直都是移动端各个端中,组件重用、内存优化的重点。今天就来分析下iOS和Android各自的重用机制。
Android:RecyclerView的缓存机制
先来熟悉下ViewHolder的几个状态
- isInvalid:表示当前
ViewHolder
是否已经失效。通常来说,在3种情况下会出现这种情况:1.调用了Adapter
的notifyDataSetChanged
方法;2. 手动调用RecyclerView
的invalidateItemDecorations
方法;3. 调用RecyclerView
的setAdapter
方法或者swapAdapter
方法。- isRemoved:表示当前的
ViewHolder
是否被移除。通常来说,数据源被移除了部分数据,然后调用Adapter
的notifyItemRemoved
方法。- isBound:表示当前
ViewHolder
是否已经调用了onBindViewHolder
。- isTmpDetached:表示当前的
ItemView
是否从RecyclerView
(即父View
)detach
掉。通常来说有两种情况下会出现这种情况:1.手动了RecyclerView
的detachView
相关方法;2. 在从mHideViews
里面获取ViewHolder
,会先detach
掉这个ViewHolder
关联的ItemView
。- isScrap:表示是否在
mAttachedScrap
或者mChangedScrap
数组里面,进而表示当前ViewHolder
是否被废弃。- isUpdated:表示当前
ViewHolder
是否已经更新。通常来说,在3种情况下会出现情况:1.isInvalid
方法存在的三种情况;2.调用了Adapter
的onBindViewHolder
方法;3. 调用了Adapter
的notifyItemChanged
方法
mAttachedScrap、mChangedScrap
mAttachedScrap
存储的是当前还在屏幕中的ViewHolder
,用不是人话来描述,就是是从屏幕上分离出来,但是又即将添加到屏幕上去