}
}
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方法ÿ