Android基础知识-RecyclerView的复用和回收机制

更新时间:2023-05-14 00:16:33 阅读: 评论:0

Android基础知识-RecyclerView的复⽤和回收机制
ListView复⽤、回收
AbsListView.RecycleBin
RecycleBin 维护了两种类型列表,
⼀种⽤于保存屏幕上可见的View,⼀个⽤于缓存滚动出屏幕的View
ListView滑动过程中,⼦View完全移出屏幕后,会加⼊RecycleBin 缓存
⼦View进⼊屏幕时,从RecycleBin 中获取缓存View,⽤于数据绑定。
RecyclerView 复⽤、回收
滚动屏幕时,列表先执⾏ 复⽤流程、再执⾏回收流程
复⽤流程:2级缓存 mCachedViews 取 > 1级缓存 RecycledViewPool 取 > CreateViewHolder()
鸡蛋煎饺
回收流程:遍历移除屏幕的 View,从 View的 LayoutParams 中取出 ViewHolder,塞⼊ 2级缓存 mCachedViews
如果 mCachedViews 满了(容量2),则 mCachedViews 移除第⼀个,⽤来放要回收的 ViewHolder
郑裕彤病逝如果 RecycledViewPool 对应 viewType 的 List 没满(容量5),则从 mCachedViews 移除的 ViewHolder 放⼊RecycledViewPool。
1、复⽤
Recycler ⽤来缓存 ViewHolder 的结构体
Recycler 缓存结构
mCachedViews ⼀级缓存:ViewHolder数据还在,只有原来的position可⽤,不需要重新绑定数据mCachedViews 默认⼤⼩为 2
RecycledViewPool ⼆级缓存:ViewHolder数据重置,需要重新绑定数据RecycledViewPool 根据不同的 item type 创建不同的 List,每个 List 默认⼤⼩为 5
复⽤时,只要 RecycledViewPool 中对应 type 的 List 有 ViewHolder 缓存,最后⼀个拿出来复⽤复⽤流程
回收
回收流程
如果 mCachedViews 超过了存储容量( 默认容量 2 ),移除 mCachedViews 第⼀个元素,放⼊RecycledViewPool 如果 RecycledViewPool对应 viewType 的 List 满了(默认每个 viewType 缓存容量 5),
则丢弃 mCachedViews 中移除的 ViewHolder
局部刷新
1、notifyItemChanged(int position, Object payload)
payload参数,传⼊⾮空Object对象
2、onBindViewHolder(RecyclerHolder holder, int position, List payloads)
payloads.size 永远是 1,根据 payload参数值,实现局部刷新
private static final String DATA_ONE = "dataOne";
private static final String DATA_TWO = "dataTwo";
notifyItemChanged(position, changePos == 0 ? DATA_ONE : DATA_TWO);
@Override
public void onBindViewHolder(RecyclerHolder holder, int position, List<Object> payloads) {
if (payloads.isEmpty()) {//payloads 为空,全量刷新
onBindViewHolder(holder, position);
} el {
for (Object payload : payloads) {
switch (String.valueOf(payload)) {
ca DATA_ONE://根据不同类型的 payload值,刷新不同的局部控件
holder.dataOne.(position));
break;
ca DATA_TWO://根据不同类型的 payload值,刷新不同的局部控件
holder.dataTwo.(position));
break;
}煎蛋
}
}
}
wharfage⼀、
RecyclerView 的回收复⽤机制的内部实现都是由 Recycler 内部类实现
1、复⽤机制
1)Recycler⽤来缓存 ViewHolder 的结构体
public final class Recycler {
/
* ⼀次遥控器按键的操作,不管有没有发⽣滑动,都会导致 RecyclerView 的重新 onLayout,
* 那要 layout 的话,RecyclerView 会先把所有 children 先 remove 掉,然后再重新 add 上去,完成⼀次 layout 的过程。  * 那么这暂时性的 remove 掉的 viewHolder 要存放在哪呢,就是放在这个 mAttachedScrap 中了
*/
final ArrayList<ViewHolder> mAttachedScrap = new ArrayList<>();
//应该是在当数据发⽣变化时才会涉及到的复⽤场景
ArrayList<ViewHolder> mChangedScrap = null;
/* 滑动过程中的回收和复⽤都是先处理的这个 List,
* 这个集合⾥存的 ViewHolder 的原本数据信息都在,
* 所以可以直接添加到 RecyclerView 中显⽰,不需要再次重新 onBindViewHolder()
*/
final ArrayList<ViewHolder> mCachedViews = new ArrayList<ViewHolder>();
private final List<ViewHolder> mUnmodifiableAttachedScrap = Collections.unmodifiableList(mAttachedScrap);
/* 存在这⾥的 ViewHolder 的数据信息会被重置掉,
显卡配置
* 相当于 ViewHolder 是⼀个重创新建的⼀样,所以需要重新调⽤ onBindViewHolder 来绑定数据
*/
RecycledViewPool mRecyclerPool;
//这个是留给我们⾃⼰扩展的
private ViewCacheExtension mViewCacheExtension;
}
1) getViewForPosition() 这个⽅法是复⽤机制的⼊⼝
这个⽅法是 Recycler 开放给外部使⽤复⽤机制的api,外部调⽤这个⽅法就可以返回想要的 View,
⽽⾄于这个 View 是复⽤⽽来的,还是重新创建得来的,就都由 Recycler 内部实现,对外隐藏。
玉米甜汤
public View getViewForPosition(int position) {
return getViewForPosition(position, fal);
}
View getViewForPosition(int position, boolean dryRun) {
return tryGetViewHolderForPositionByDeadline(position, dryRun, FOREVER_NS).itemView;
}
/**
* Recycler 的复⽤机制内部实现就在这个⽅法⾥
*/
ViewHolder tryGetViewHolderForPositionByDeadline(int position, boolean dryRun, long deadlineNs) {
...老板树
boolean fromScrapOrHiddenOrCache = fal;
ViewHolder holder = null;
帅用英语怎么说...
// 1) Find by position from scrap/hidden list/cache
if (holder == null) {
holder = getScrapOrHiddenOrCachedHolderForPosition(position, dryRun);
...
}
}
ViewHolder getScrapOrHiddenOrCachedHolderForPosition(int position, boolean dryRun) {
final int scrapCount = mAttachedScrap.size();
// Try first for an exact, non-invalid match from scrap.
for (int i = 0; i < scrapCount; i++) {
/* 去 mAttachedScrap 中寻找 position ⼀致的 viewHolder,
* 这个 viewHolder 没有被移除,是有效的之类的条件,满⾜就返回这个 viewHolder
*
* ⼀次遥控器按键的操作,不管有没有发⽣滑动,都会导致 RecyclerView 的重新 onLayout,
* 那要 layout 的话,RecyclerView 会先把所有 children 先 remove 掉,然后再重新 add 上去,完成⼀次 layout 的过程。  * 那么这暂时性的 remove 掉的 viewHolder 要存放在哪呢,就是放在这个 mAttachedScrap 中了
*

本文发布于:2023-05-14 00:16:33,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/620209.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   屏幕   缓存
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图