android进阶篇02、RecyclerView回收复用机制源码解析,大厂Android开发面试解答

}

}

4、LinearLayoutManager -> scrollVerticallyBy

如下所示,注释1表示scrollVerticallyBy又会调用scrollBy;

public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler,

RecyclerView.State state) {

if (mOrientation == HORIZONTAL) {

return 0;

}

return scrollBy(dy, recycler, state); //1

}

5、LinearLayoutManager -> scrollBy

如下所示,注释1处表示又会调用fill方法,官方注释表示这是一个神奇的方法,回收与复用共同的入口;

int scrollBy(int delta, RecyclerView.Recycler recycler, RecyclerView.State state) {

、、、

final int consumed = mLayoutState.mScrollingOffset + fill(recycler, mLayoutState, state, false); //1

、、、

}

6、LinearLayoutManager -> fill

fill方法如下所示,注释1处的recycleByLayoutState是回收部分入口;注释2处的layoutChunk是复用部分入口;我们在第二部分分析recycleByLayoutState,第三部分分析layoutChunk;

int fill(RecyclerView.Recycler recycler, LayoutState layoutState,

RecyclerView.State state, boolean stopOnFocusable) {

、、、

if (layoutState.mScrollingOffset != LayoutState.SCROLLING_OFFSET_NaN) {

、、、

recycleByLayoutState(recycler, layoutState); //1

}

while ((layoutState.mInfinite || remainingSpace > 0) && layoutState.hasMore(state)) {

、、、

layoutChunk(recycler, state, layoutState, layoutChunkResult); //2

、、、

}

}

二、回收部分


1、LinearLayoutManager -> recycleByLayoutState

注释1和注释2处分别表示从start和end回收,原理都是相同的,这里我们以注释1举例;

private void recycleByLayoutState(RecyclerView.Recycler recycler, LayoutState layoutState) {

、、、

if (layoutState.mLayoutDirection == LayoutState.LAYOUT_START) {

recycleViewsFromEnd(recycler, scrollingOffset, noRecycleSpace); //1

} else {

recycleViewsFromStart(recycler, scrollingOffset, noRecycleSpace); //2

}

}

2、LinearLayoutManager -> recycleViewsFromEnd

如注释1所示,又会调用recycleChildren进行回收;

private void recycleViewsFromEnd(RecyclerView.Recycler recycler, int scrollingOffset,

int noRecycleSpace) {

、、、

if (mShouldReverseLayout) {

for (int i = 0; i < childCount; i++) {

View child = getChildAt(i);

if (mOrientationHelper.getDecoratedStart(child) < limit

|| mOrientationHelper.getTransformedStartWithDecoration(child) < limit) {

// stop here

recycleChildren(recycler, 0, i); //1

return;

}

}

}

}

3、LinearLayoutManager -> recycleChildren

如下所示,注释1处表示又会调用removeAndRecycleViewAt方法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值