首先要感谢几位大神的分析
RecyclerView剖析
深入浅出 RecyclerView
掌握自定义LayoutManager(二) 实现流式布局
谈谈RecyclerView的LayoutManager
(建议结合源码观看)
onLayout的主要部分就是3个方法:
dispatchLayoutStep1,dispatchLayoutStep2,dispatchLayoutStep3
dispatchLayoutStep1
processAdapterUpdates
先看第一个,进入processAdapterUpdatesAndSetAnimationFlags方法
(看名字可知有2个功能:processUpdate和setFlags)
第一个判断不执行
第二个判断成立,进去里面看看
进入了AdapterHelper的preProcess方法,(当adapter的notifyItemXXX调用时,信息最后保存在这个类的成员变量mPendingUpdates)
void preProcess() {
mOpReorderer.reorderOps(mPendingUpdates);
final int count = mPendingUpdates.size();
for (int i = 0; i < count; i++) {
UpdateOp op = mPendingUpdates.get(i);
switch (op.cmd) {
case UpdateOp.ADD:
applyAdd(op);
break;
case UpdateOp.REMOVE:
applyRemove(op);
break;
case UpdateOp.UPDATE:
applyUpdate(op);
break;
case UpdateOp.MOVE:
applyMove(op);
break;
}
if (mOnItemProcessedCallback != null) {
mOnItemProcessedCallback.run();
}
}
mPendingUpdates.clear();
}
第一句mOpReorderer.reorderOps(mPendingUpdates),这句会把moveOp移动到mPendingUpdates最后面,并且修正引起的偏差。
然后就是遍历所有update,以add为例,op加入到mPostponedList中,最后调用到了RecyclerView的offsetPositionRecordsForInsert(int positionStart, int itemCount)方法;
每个viewHolder有一个mPosition变量,这个方法会找出所有mPosition大于positionStart的子viewHolder,这些viewHolder的mPosition应该加上itemCount才正确,这个方法还会把layoutParams的mInsetsDirty置false,表示decoration受到影响。
还会调整Recycler的mCachedViews,调整方