1、RecycleView中的Recycler类里面包含了缓存需要的一些类,重要的类包括:
//最多缓存两个ViewHolder,取position对比,position对应上才会取并返回,不需要调用onBindViewHolder()
final ArrayList<ViewHolder> mCachedViews = new ArrayList<ViewHolder>();
//根据viewType找到缓存的viewHolder,每种类型缓存5个。ScrapData中的ArrayList<ViewHolder> mScrapHeap,都是使用ArrayList缓存的。找到后重置数据,所以需要重新调用onBindViewHolder绑定数据。
RecycledViewPool mRecyclerPool;
2、缓存的类型:先去mCachedView中找(根据position,不需要调用onBindViewHolder),找不到从RecycleViewPool中找(找到后,重置数据,需要调用onBindViewHolder),再找不到就onCreateViewHolder来创建。
3、获取缓存的方法:
public View getViewForPosition(int position) {
return getViewForPosition(position, false);
}
View getViewForPosition(int position, boolean dryRun) {
return tryGetViewHolderForPositionByDeadline(position, dryRun, FOREVER_NS).itemView;
}
4、找到Viewholder后,判断要不要重新绑定数据(tryBindViewHolderByDeadline
).设置LayoutParams
5、public void recycleView(View view)
回收view的方法
mCachedView大于2个时,从移除头部,并加入RecycleViewPool.
如果mCachedView小于2个时,则把viewHolder加入mCachedViews中
6、recycleView是先复用后回收
7、优化步骤
取消默认动画
mRecyclerView.setItemAnimator(null);
Item等高,减少测量次数
mRecyclerView.setHasFixedSize(true);
设置缓存池缓存数量
mPool.setMaxRecycledViews(itemViewType, number);
设置recycleView缓存数量
mRecyclerView.setItemViewCacheSize(10);
避免创建过多对象
8、
网友评论