1071 lines
45 KiB
Java
1071 lines
45 KiB
Java
package androidx.recyclerview.widget;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Rect;
|
|
import android.util.AttributeSet;
|
|
import android.util.SparseIntArray;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
|
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
import c.d.b.a.a;
|
|
import java.util.Arrays;
|
|
public class GridLayoutManager extends LinearLayoutManager {
|
|
private static final boolean DEBUG = false;
|
|
public static final int DEFAULT_SPAN_COUNT = -1;
|
|
private static final String TAG = "GridLayoutManager";
|
|
public int[] mCachedBorders;
|
|
public final Rect mDecorInsets = new Rect();
|
|
public boolean mPendingSpanCountChange = false;
|
|
public final SparseIntArray mPreLayoutSpanIndexCache = new SparseIntArray();
|
|
public final SparseIntArray mPreLayoutSpanSizeCache = new SparseIntArray();
|
|
public View[] mSet;
|
|
public int mSpanCount = -1;
|
|
public SpanSizeLookup mSpanSizeLookup = new DefaultSpanSizeLookup();
|
|
private boolean mUsingSpansToEstimateScrollBarDimensions;
|
|
|
|
public static final class DefaultSpanSizeLookup extends SpanSizeLookup {
|
|
@Override // androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup
|
|
public int getSpanIndex(int i, int i2) {
|
|
return i % i2;
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup
|
|
public int getSpanSize(int i) {
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
public static class LayoutParams extends RecyclerView.LayoutParams {
|
|
public static final int INVALID_SPAN_ID = -1;
|
|
public int mSpanIndex = -1;
|
|
public int mSpanSize = 0;
|
|
|
|
public LayoutParams(int i, int i2) {
|
|
super(i, i2);
|
|
}
|
|
|
|
public LayoutParams(Context context, AttributeSet attributeSet) {
|
|
super(context, attributeSet);
|
|
}
|
|
|
|
public LayoutParams(ViewGroup.LayoutParams layoutParams) {
|
|
super(layoutParams);
|
|
}
|
|
|
|
public LayoutParams(ViewGroup.MarginLayoutParams marginLayoutParams) {
|
|
super(marginLayoutParams);
|
|
}
|
|
|
|
public LayoutParams(RecyclerView.LayoutParams layoutParams) {
|
|
super(layoutParams);
|
|
}
|
|
|
|
public int getSpanIndex() {
|
|
return this.mSpanIndex;
|
|
}
|
|
|
|
public int getSpanSize() {
|
|
return this.mSpanSize;
|
|
}
|
|
}
|
|
|
|
public static abstract class SpanSizeLookup {
|
|
private boolean mCacheSpanGroupIndices = false;
|
|
private boolean mCacheSpanIndices = false;
|
|
public final SparseIntArray mSpanGroupIndexCache = new SparseIntArray();
|
|
public final SparseIntArray mSpanIndexCache = new SparseIntArray();
|
|
|
|
public static int findFirstKeyLessThan(SparseIntArray sparseIntArray, int i) {
|
|
int size = sparseIntArray.size() - 1;
|
|
int i2 = 0;
|
|
while (i2 <= size) {
|
|
int i3 = (i2 + size) >>> 1;
|
|
if (sparseIntArray.keyAt(i3) < i) {
|
|
i2 = i3 + 1;
|
|
} else {
|
|
size = i3 - 1;
|
|
}
|
|
}
|
|
int i4 = i2 - 1;
|
|
if (i4 < 0 || i4 >= sparseIntArray.size()) {
|
|
return -1;
|
|
}
|
|
return sparseIntArray.keyAt(i4);
|
|
}
|
|
|
|
public int getCachedSpanGroupIndex(int i, int i2) {
|
|
if (!this.mCacheSpanGroupIndices) {
|
|
return getSpanGroupIndex(i, i2);
|
|
}
|
|
int i3 = this.mSpanGroupIndexCache.get(i, -1);
|
|
if (i3 != -1) {
|
|
return i3;
|
|
}
|
|
int spanGroupIndex = getSpanGroupIndex(i, i2);
|
|
this.mSpanGroupIndexCache.put(i, spanGroupIndex);
|
|
return spanGroupIndex;
|
|
}
|
|
|
|
public int getCachedSpanIndex(int i, int i2) {
|
|
if (!this.mCacheSpanIndices) {
|
|
return getSpanIndex(i, i2);
|
|
}
|
|
int i3 = this.mSpanIndexCache.get(i, -1);
|
|
if (i3 != -1) {
|
|
return i3;
|
|
}
|
|
int spanIndex = getSpanIndex(i, i2);
|
|
this.mSpanIndexCache.put(i, spanIndex);
|
|
return spanIndex;
|
|
}
|
|
|
|
public int getSpanGroupIndex(int i, int i2) {
|
|
int i3;
|
|
int i4;
|
|
int i5;
|
|
int findFirstKeyLessThan;
|
|
if (!this.mCacheSpanGroupIndices || (findFirstKeyLessThan = findFirstKeyLessThan(this.mSpanGroupIndexCache, i)) == -1) {
|
|
i5 = 0;
|
|
i4 = 0;
|
|
i3 = 0;
|
|
} else {
|
|
i4 = this.mSpanGroupIndexCache.get(findFirstKeyLessThan);
|
|
i3 = findFirstKeyLessThan + 1;
|
|
i5 = getSpanSize(findFirstKeyLessThan) + getCachedSpanIndex(findFirstKeyLessThan, i2);
|
|
if (i5 == i2) {
|
|
i4++;
|
|
i5 = 0;
|
|
}
|
|
}
|
|
int spanSize = getSpanSize(i);
|
|
while (i3 < i) {
|
|
int spanSize2 = getSpanSize(i3);
|
|
i5 += spanSize2;
|
|
if (i5 == i2) {
|
|
i4++;
|
|
i5 = 0;
|
|
} else if (i5 > i2) {
|
|
i4++;
|
|
i5 = spanSize2;
|
|
}
|
|
i3++;
|
|
}
|
|
return i5 + spanSize > i2 ? i4 + 1 : i4;
|
|
}
|
|
|
|
/* JADX WARNING: Removed duplicated region for block: B:10:0x0024 */
|
|
public int getSpanIndex(int i, int i2) {
|
|
int i3;
|
|
int i4;
|
|
int spanSize = getSpanSize(i);
|
|
if (spanSize == i2) {
|
|
return 0;
|
|
}
|
|
if (!this.mCacheSpanIndices || (i4 = findFirstKeyLessThan(this.mSpanIndexCache, i)) < 0) {
|
|
i4 = 0;
|
|
i3 = 0;
|
|
} else {
|
|
i3 = getSpanSize(i4) + this.mSpanIndexCache.get(i4);
|
|
i4++;
|
|
}
|
|
if (i4 < i) {
|
|
int spanSize2 = getSpanSize(i4);
|
|
i3 += spanSize2;
|
|
if (i3 == i2) {
|
|
i3 = 0;
|
|
} else if (i3 > i2) {
|
|
i3 = spanSize2;
|
|
}
|
|
i4++;
|
|
if (i4 < i) {
|
|
}
|
|
}
|
|
if (spanSize + i3 <= i2) {
|
|
return i3;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
public abstract int getSpanSize(int i);
|
|
|
|
public void invalidateSpanGroupIndexCache() {
|
|
this.mSpanGroupIndexCache.clear();
|
|
}
|
|
|
|
public void invalidateSpanIndexCache() {
|
|
this.mSpanIndexCache.clear();
|
|
}
|
|
|
|
public boolean isSpanGroupIndexCacheEnabled() {
|
|
return this.mCacheSpanGroupIndices;
|
|
}
|
|
|
|
public boolean isSpanIndexCacheEnabled() {
|
|
return this.mCacheSpanIndices;
|
|
}
|
|
|
|
public void setSpanGroupIndexCacheEnabled(boolean z2) {
|
|
if (!z2) {
|
|
this.mSpanGroupIndexCache.clear();
|
|
}
|
|
this.mCacheSpanGroupIndices = z2;
|
|
}
|
|
|
|
public void setSpanIndexCacheEnabled(boolean z2) {
|
|
if (!z2) {
|
|
this.mSpanGroupIndexCache.clear();
|
|
}
|
|
this.mCacheSpanIndices = z2;
|
|
}
|
|
}
|
|
|
|
public GridLayoutManager(Context context, int i) {
|
|
super(context);
|
|
setSpanCount(i);
|
|
}
|
|
|
|
public GridLayoutManager(Context context, int i, int i2, boolean z2) {
|
|
super(context, i2, z2);
|
|
setSpanCount(i);
|
|
}
|
|
|
|
public GridLayoutManager(Context context, AttributeSet attributeSet, int i, int i2) {
|
|
super(context, attributeSet, i, i2);
|
|
setSpanCount(RecyclerView.LayoutManager.getProperties(context, attributeSet, i, i2).spanCount);
|
|
}
|
|
|
|
private void assignSpans(RecyclerView.Recycler recycler, RecyclerView.State state, int i, boolean z2) {
|
|
int i2;
|
|
int i3;
|
|
int i4 = 0;
|
|
int i5 = -1;
|
|
if (z2) {
|
|
i5 = i;
|
|
i3 = 0;
|
|
i2 = 1;
|
|
} else {
|
|
i3 = i - 1;
|
|
i2 = -1;
|
|
}
|
|
while (i3 != i5) {
|
|
View view = this.mSet[i3];
|
|
LayoutParams layoutParams = (LayoutParams) view.getLayoutParams();
|
|
int spanSize = getSpanSize(recycler, state, getPosition(view));
|
|
layoutParams.mSpanSize = spanSize;
|
|
layoutParams.mSpanIndex = i4;
|
|
i4 += spanSize;
|
|
i3 += i2;
|
|
}
|
|
}
|
|
|
|
private void cachePreLayoutSpanMapping() {
|
|
int childCount = getChildCount();
|
|
for (int i = 0; i < childCount; i++) {
|
|
LayoutParams layoutParams = (LayoutParams) getChildAt(i).getLayoutParams();
|
|
int viewLayoutPosition = layoutParams.getViewLayoutPosition();
|
|
this.mPreLayoutSpanSizeCache.put(viewLayoutPosition, layoutParams.getSpanSize());
|
|
this.mPreLayoutSpanIndexCache.put(viewLayoutPosition, layoutParams.getSpanIndex());
|
|
}
|
|
}
|
|
|
|
private void calculateItemBorders(int i) {
|
|
this.mCachedBorders = calculateItemBorders(this.mCachedBorders, this.mSpanCount, i);
|
|
}
|
|
|
|
public static int[] calculateItemBorders(int[] iArr, int i, int i2) {
|
|
int i3;
|
|
if (!(iArr != null && iArr.length == i + 1 && iArr[iArr.length - 1] == i2)) {
|
|
iArr = new int[(i + 1)];
|
|
}
|
|
int i4 = 0;
|
|
iArr[0] = 0;
|
|
int i5 = i2 / i;
|
|
int i6 = i2 % i;
|
|
int i7 = 0;
|
|
for (int i8 = 1; i8 <= i; i8++) {
|
|
i4 += i6;
|
|
if (i4 <= 0 || i - i4 >= i6) {
|
|
i3 = i5;
|
|
} else {
|
|
i3 = i5 + 1;
|
|
i4 -= i;
|
|
}
|
|
i7 += i3;
|
|
iArr[i8] = i7;
|
|
}
|
|
return iArr;
|
|
}
|
|
|
|
private void clearPreLayoutSpanMappingCache() {
|
|
this.mPreLayoutSpanSizeCache.clear();
|
|
this.mPreLayoutSpanIndexCache.clear();
|
|
}
|
|
|
|
private int computeScrollOffsetWithSpanInfo(RecyclerView.State state) {
|
|
if (!(getChildCount() == 0 || state.getItemCount() == 0)) {
|
|
ensureLayoutState();
|
|
boolean isSmoothScrollbarEnabled = isSmoothScrollbarEnabled();
|
|
View findFirstVisibleChildClosestToStart = findFirstVisibleChildClosestToStart(!isSmoothScrollbarEnabled, true);
|
|
View findFirstVisibleChildClosestToEnd = findFirstVisibleChildClosestToEnd(!isSmoothScrollbarEnabled, true);
|
|
if (!(findFirstVisibleChildClosestToStart == null || findFirstVisibleChildClosestToEnd == null)) {
|
|
int cachedSpanGroupIndex = this.mSpanSizeLookup.getCachedSpanGroupIndex(getPosition(findFirstVisibleChildClosestToStart), this.mSpanCount);
|
|
int cachedSpanGroupIndex2 = this.mSpanSizeLookup.getCachedSpanGroupIndex(getPosition(findFirstVisibleChildClosestToEnd), this.mSpanCount);
|
|
int min = Math.min(cachedSpanGroupIndex, cachedSpanGroupIndex2);
|
|
int max = this.mShouldReverseLayout ? Math.max(0, ((this.mSpanSizeLookup.getCachedSpanGroupIndex(state.getItemCount() - 1, this.mSpanCount) + 1) - Math.max(cachedSpanGroupIndex, cachedSpanGroupIndex2)) - 1) : Math.max(0, min);
|
|
if (!isSmoothScrollbarEnabled) {
|
|
return max;
|
|
}
|
|
return Math.round((((float) max) * (((float) Math.abs(this.mOrientationHelper.getDecoratedEnd(findFirstVisibleChildClosestToEnd) - this.mOrientationHelper.getDecoratedStart(findFirstVisibleChildClosestToStart))) / ((float) ((this.mSpanSizeLookup.getCachedSpanGroupIndex(getPosition(findFirstVisibleChildClosestToEnd), this.mSpanCount) - this.mSpanSizeLookup.getCachedSpanGroupIndex(getPosition(findFirstVisibleChildClosestToStart), this.mSpanCount)) + 1)))) + ((float) (this.mOrientationHelper.getStartAfterPadding() - this.mOrientationHelper.getDecoratedStart(findFirstVisibleChildClosestToStart))));
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
private int computeScrollRangeWithSpanInfo(RecyclerView.State state) {
|
|
if (!(getChildCount() == 0 || state.getItemCount() == 0)) {
|
|
ensureLayoutState();
|
|
View findFirstVisibleChildClosestToStart = findFirstVisibleChildClosestToStart(!isSmoothScrollbarEnabled(), true);
|
|
View findFirstVisibleChildClosestToEnd = findFirstVisibleChildClosestToEnd(!isSmoothScrollbarEnabled(), true);
|
|
if (!(findFirstVisibleChildClosestToStart == null || findFirstVisibleChildClosestToEnd == null)) {
|
|
if (!isSmoothScrollbarEnabled()) {
|
|
return this.mSpanSizeLookup.getCachedSpanGroupIndex(state.getItemCount() - 1, this.mSpanCount) + 1;
|
|
}
|
|
int decoratedEnd = this.mOrientationHelper.getDecoratedEnd(findFirstVisibleChildClosestToEnd) - this.mOrientationHelper.getDecoratedStart(findFirstVisibleChildClosestToStart);
|
|
int cachedSpanGroupIndex = this.mSpanSizeLookup.getCachedSpanGroupIndex(getPosition(findFirstVisibleChildClosestToStart), this.mSpanCount);
|
|
return (int) ((((float) decoratedEnd) / ((float) ((this.mSpanSizeLookup.getCachedSpanGroupIndex(getPosition(findFirstVisibleChildClosestToEnd), this.mSpanCount) - cachedSpanGroupIndex) + 1))) * ((float) (this.mSpanSizeLookup.getCachedSpanGroupIndex(state.getItemCount() - 1, this.mSpanCount) + 1)));
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
private void ensureAnchorIsInCorrectSpan(RecyclerView.Recycler recycler, RecyclerView.State state, LinearLayoutManager.AnchorInfo anchorInfo, int i) {
|
|
boolean z2 = i == 1;
|
|
int spanIndex = getSpanIndex(recycler, state, anchorInfo.mPosition);
|
|
if (z2) {
|
|
while (spanIndex > 0) {
|
|
int i2 = anchorInfo.mPosition;
|
|
if (i2 > 0) {
|
|
int i3 = i2 - 1;
|
|
anchorInfo.mPosition = i3;
|
|
spanIndex = getSpanIndex(recycler, state, i3);
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
int itemCount = state.getItemCount() - 1;
|
|
int i4 = anchorInfo.mPosition;
|
|
while (i4 < itemCount) {
|
|
int i5 = i4 + 1;
|
|
int spanIndex2 = getSpanIndex(recycler, state, i5);
|
|
if (spanIndex2 <= spanIndex) {
|
|
break;
|
|
}
|
|
i4 = i5;
|
|
spanIndex = spanIndex2;
|
|
}
|
|
anchorInfo.mPosition = i4;
|
|
}
|
|
|
|
private void ensureViewSet() {
|
|
View[] viewArr = this.mSet;
|
|
if (viewArr == null || viewArr.length != this.mSpanCount) {
|
|
this.mSet = new View[this.mSpanCount];
|
|
}
|
|
}
|
|
|
|
private int getSpanGroupIndex(RecyclerView.Recycler recycler, RecyclerView.State state, int i) {
|
|
if (!state.isPreLayout()) {
|
|
return this.mSpanSizeLookup.getCachedSpanGroupIndex(i, this.mSpanCount);
|
|
}
|
|
int convertPreLayoutPositionToPostLayout = recycler.convertPreLayoutPositionToPostLayout(i);
|
|
if (convertPreLayoutPositionToPostLayout != -1) {
|
|
return this.mSpanSizeLookup.getCachedSpanGroupIndex(convertPreLayoutPositionToPostLayout, this.mSpanCount);
|
|
}
|
|
a.d0("Cannot find span size for pre layout position. ", i, "GridLayoutManager");
|
|
return 0;
|
|
}
|
|
|
|
private int getSpanIndex(RecyclerView.Recycler recycler, RecyclerView.State state, int i) {
|
|
if (!state.isPreLayout()) {
|
|
return this.mSpanSizeLookup.getCachedSpanIndex(i, this.mSpanCount);
|
|
}
|
|
int i2 = this.mPreLayoutSpanIndexCache.get(i, -1);
|
|
if (i2 != -1) {
|
|
return i2;
|
|
}
|
|
int convertPreLayoutPositionToPostLayout = recycler.convertPreLayoutPositionToPostLayout(i);
|
|
if (convertPreLayoutPositionToPostLayout != -1) {
|
|
return this.mSpanSizeLookup.getCachedSpanIndex(convertPreLayoutPositionToPostLayout, this.mSpanCount);
|
|
}
|
|
a.d0("Cannot find span size for pre layout position. It is not cached, not in the adapter. Pos:", i, "GridLayoutManager");
|
|
return 0;
|
|
}
|
|
|
|
private int getSpanSize(RecyclerView.Recycler recycler, RecyclerView.State state, int i) {
|
|
if (!state.isPreLayout()) {
|
|
return this.mSpanSizeLookup.getSpanSize(i);
|
|
}
|
|
int i2 = this.mPreLayoutSpanSizeCache.get(i, -1);
|
|
if (i2 != -1) {
|
|
return i2;
|
|
}
|
|
int convertPreLayoutPositionToPostLayout = recycler.convertPreLayoutPositionToPostLayout(i);
|
|
if (convertPreLayoutPositionToPostLayout != -1) {
|
|
return this.mSpanSizeLookup.getSpanSize(convertPreLayoutPositionToPostLayout);
|
|
}
|
|
a.d0("Cannot find span size for pre layout position. It is not cached, not in the adapter. Pos:", i, "GridLayoutManager");
|
|
return 1;
|
|
}
|
|
|
|
private void guessMeasurement(float f, int i) {
|
|
calculateItemBorders(Math.max(Math.round(f * ((float) this.mSpanCount)), i));
|
|
}
|
|
|
|
private void measureChild(View view, int i, boolean z2) {
|
|
int i2;
|
|
int i3;
|
|
LayoutParams layoutParams = (LayoutParams) view.getLayoutParams();
|
|
Rect rect = layoutParams.mDecorInsets;
|
|
int i4 = rect.top + rect.bottom + ((ViewGroup.MarginLayoutParams) layoutParams).topMargin + ((ViewGroup.MarginLayoutParams) layoutParams).bottomMargin;
|
|
int i5 = rect.left + rect.right + ((ViewGroup.MarginLayoutParams) layoutParams).leftMargin + ((ViewGroup.MarginLayoutParams) layoutParams).rightMargin;
|
|
int spaceForSpanRange = getSpaceForSpanRange(layoutParams.mSpanIndex, layoutParams.mSpanSize);
|
|
if (this.mOrientation == 1) {
|
|
i2 = RecyclerView.LayoutManager.getChildMeasureSpec(spaceForSpanRange, i, i5, ((ViewGroup.MarginLayoutParams) layoutParams).width, false);
|
|
i3 = RecyclerView.LayoutManager.getChildMeasureSpec(this.mOrientationHelper.getTotalSpace(), getHeightMode(), i4, ((ViewGroup.MarginLayoutParams) layoutParams).height, true);
|
|
} else {
|
|
int childMeasureSpec = RecyclerView.LayoutManager.getChildMeasureSpec(spaceForSpanRange, i, i4, ((ViewGroup.MarginLayoutParams) layoutParams).height, false);
|
|
int childMeasureSpec2 = RecyclerView.LayoutManager.getChildMeasureSpec(this.mOrientationHelper.getTotalSpace(), getWidthMode(), i5, ((ViewGroup.MarginLayoutParams) layoutParams).width, true);
|
|
i3 = childMeasureSpec;
|
|
i2 = childMeasureSpec2;
|
|
}
|
|
measureChildWithDecorationsAndMargin(view, i2, i3, z2);
|
|
}
|
|
|
|
private void measureChildWithDecorationsAndMargin(View view, int i, int i2, boolean z2) {
|
|
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();
|
|
if (z2 ? shouldReMeasureChild(view, i, i2, layoutParams) : shouldMeasureChild(view, i, i2, layoutParams)) {
|
|
view.measure(i, i2);
|
|
}
|
|
}
|
|
|
|
private void updateMeasurements() {
|
|
int i;
|
|
int i2;
|
|
if (getOrientation() == 1) {
|
|
i2 = getWidth() - getPaddingRight();
|
|
i = getPaddingLeft();
|
|
} else {
|
|
i2 = getHeight() - getPaddingBottom();
|
|
i = getPaddingTop();
|
|
}
|
|
calculateItemBorders(i2 - i);
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public boolean checkLayoutParams(RecyclerView.LayoutParams layoutParams) {
|
|
return layoutParams instanceof LayoutParams;
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager
|
|
public void collectPrefetchPositionsForLayoutState(RecyclerView.State state, LinearLayoutManager.LayoutState layoutState, RecyclerView.LayoutManager.LayoutPrefetchRegistry layoutPrefetchRegistry) {
|
|
int i = this.mSpanCount;
|
|
for (int i2 = 0; i2 < this.mSpanCount && layoutState.hasMore(state) && i > 0; i2++) {
|
|
int i3 = layoutState.mCurrentPosition;
|
|
layoutPrefetchRegistry.addPosition(i3, Math.max(0, layoutState.mScrollingOffset));
|
|
i -= this.mSpanSizeLookup.getSpanSize(i3);
|
|
layoutState.mCurrentPosition += layoutState.mItemDirection;
|
|
}
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager, androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public int computeHorizontalScrollOffset(RecyclerView.State state) {
|
|
return this.mUsingSpansToEstimateScrollBarDimensions ? computeScrollOffsetWithSpanInfo(state) : super.computeHorizontalScrollOffset(state);
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager, androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public int computeHorizontalScrollRange(RecyclerView.State state) {
|
|
return this.mUsingSpansToEstimateScrollBarDimensions ? computeScrollRangeWithSpanInfo(state) : super.computeHorizontalScrollRange(state);
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager, androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public int computeVerticalScrollOffset(RecyclerView.State state) {
|
|
return this.mUsingSpansToEstimateScrollBarDimensions ? computeScrollOffsetWithSpanInfo(state) : super.computeVerticalScrollOffset(state);
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager, androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public int computeVerticalScrollRange(RecyclerView.State state) {
|
|
return this.mUsingSpansToEstimateScrollBarDimensions ? computeScrollRangeWithSpanInfo(state) : super.computeVerticalScrollRange(state);
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager
|
|
public View findReferenceChild(RecyclerView.Recycler recycler, RecyclerView.State state, int i, int i2, int i3) {
|
|
ensureLayoutState();
|
|
int startAfterPadding = this.mOrientationHelper.getStartAfterPadding();
|
|
int endAfterPadding = this.mOrientationHelper.getEndAfterPadding();
|
|
int i4 = i2 > i ? 1 : -1;
|
|
View view = null;
|
|
View view2 = null;
|
|
while (i != i2) {
|
|
View childAt = getChildAt(i);
|
|
int position = getPosition(childAt);
|
|
if (position >= 0 && position < i3 && getSpanIndex(recycler, state, position) == 0) {
|
|
if (((RecyclerView.LayoutParams) childAt.getLayoutParams()).isItemRemoved()) {
|
|
if (view2 == null) {
|
|
view2 = childAt;
|
|
}
|
|
} else if (this.mOrientationHelper.getDecoratedStart(childAt) < endAfterPadding && this.mOrientationHelper.getDecoratedEnd(childAt) >= startAfterPadding) {
|
|
return childAt;
|
|
} else {
|
|
if (view == null) {
|
|
view = childAt;
|
|
}
|
|
}
|
|
}
|
|
i += i4;
|
|
}
|
|
return view != null ? view : view2;
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager, androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public RecyclerView.LayoutParams generateDefaultLayoutParams() {
|
|
return this.mOrientation == 0 ? new LayoutParams(-2, -1) : new LayoutParams(-1, -2);
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public RecyclerView.LayoutParams generateLayoutParams(Context context, AttributeSet attributeSet) {
|
|
return new LayoutParams(context, attributeSet);
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public RecyclerView.LayoutParams generateLayoutParams(ViewGroup.LayoutParams layoutParams) {
|
|
return layoutParams instanceof ViewGroup.MarginLayoutParams ? new LayoutParams((ViewGroup.MarginLayoutParams) layoutParams) : new LayoutParams(layoutParams);
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public int getColumnCountForAccessibility(RecyclerView.Recycler recycler, RecyclerView.State state) {
|
|
if (this.mOrientation == 1) {
|
|
return this.mSpanCount;
|
|
}
|
|
if (state.getItemCount() < 1) {
|
|
return 0;
|
|
}
|
|
return getSpanGroupIndex(recycler, state, state.getItemCount() - 1) + 1;
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public int getRowCountForAccessibility(RecyclerView.Recycler recycler, RecyclerView.State state) {
|
|
if (this.mOrientation == 0) {
|
|
return this.mSpanCount;
|
|
}
|
|
if (state.getItemCount() < 1) {
|
|
return 0;
|
|
}
|
|
return getSpanGroupIndex(recycler, state, state.getItemCount() - 1) + 1;
|
|
}
|
|
|
|
public int getSpaceForSpanRange(int i, int i2) {
|
|
if (this.mOrientation != 1 || !isLayoutRTL()) {
|
|
int[] iArr = this.mCachedBorders;
|
|
return iArr[i2 + i] - iArr[i];
|
|
}
|
|
int[] iArr2 = this.mCachedBorders;
|
|
int i3 = this.mSpanCount;
|
|
return iArr2[i3 - i] - iArr2[(i3 - i) - i2];
|
|
}
|
|
|
|
public int getSpanCount() {
|
|
return this.mSpanCount;
|
|
}
|
|
|
|
public SpanSizeLookup getSpanSizeLookup() {
|
|
return this.mSpanSizeLookup;
|
|
}
|
|
|
|
public boolean isUsingSpansToEstimateScrollbarDimensions() {
|
|
return this.mUsingSpansToEstimateScrollBarDimensions;
|
|
}
|
|
|
|
/* JADX DEBUG: Multi-variable search result rejected for r18v0, resolved type: androidx.recyclerview.widget.GridLayoutManager */
|
|
/* JADX WARN: Multi-variable type inference failed */
|
|
/* JADX WARNING: Unknown variable types count: 1 */
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager
|
|
public void layoutChunk(RecyclerView.Recycler recycler, RecyclerView.State state, LinearLayoutManager.LayoutState layoutState, LinearLayoutManager.LayoutChunkResult layoutChunkResult) {
|
|
int i;
|
|
int i2;
|
|
int i3;
|
|
int i4;
|
|
int i5;
|
|
int i6;
|
|
int i7;
|
|
int i8;
|
|
int i9;
|
|
int i10;
|
|
View next;
|
|
int modeInOther = this.mOrientationHelper.getModeInOther();
|
|
?? r5 = 0;
|
|
boolean z2 = modeInOther != 1073741824;
|
|
int i11 = getChildCount() > 0 ? this.mCachedBorders[this.mSpanCount] : 0;
|
|
if (z2) {
|
|
updateMeasurements();
|
|
}
|
|
boolean z3 = layoutState.mItemDirection == 1;
|
|
int i12 = this.mSpanCount;
|
|
if (!z3) {
|
|
i12 = getSpanIndex(recycler, state, layoutState.mCurrentPosition) + getSpanSize(recycler, state, layoutState.mCurrentPosition);
|
|
}
|
|
int i13 = 0;
|
|
while (i13 < this.mSpanCount && layoutState.hasMore(state) && i12 > 0) {
|
|
int i14 = layoutState.mCurrentPosition;
|
|
int spanSize = getSpanSize(recycler, state, i14);
|
|
if (spanSize <= this.mSpanCount) {
|
|
i12 -= spanSize;
|
|
if (i12 < 0 || (next = layoutState.next(recycler)) == null) {
|
|
break;
|
|
}
|
|
this.mSet[i13] = next;
|
|
i13++;
|
|
} else {
|
|
throw new IllegalArgumentException(a.w(a.M("Item at position ", i14, " requires ", spanSize, " spans but GridLayoutManager has only "), this.mSpanCount, " spans."));
|
|
}
|
|
}
|
|
if (i13 == 0) {
|
|
layoutChunkResult.mFinished = true;
|
|
return;
|
|
}
|
|
float f = 0.0f;
|
|
assignSpans(recycler, state, i13, z3);
|
|
int i15 = 0;
|
|
int i16 = 0;
|
|
while (i15 < i13) {
|
|
View view = this.mSet[i15];
|
|
if (layoutState.mScrapList == null) {
|
|
if (z3) {
|
|
addView(view);
|
|
} else {
|
|
addView(view, r5);
|
|
}
|
|
} else if (z3) {
|
|
addDisappearingView(view);
|
|
} else {
|
|
int i17 = r5 == true ? 1 : 0;
|
|
int i18 = r5 == true ? 1 : 0;
|
|
int i19 = r5 == true ? 1 : 0;
|
|
addDisappearingView(view, i17);
|
|
}
|
|
calculateItemDecorationsForChild(view, this.mDecorInsets);
|
|
measureChild(view, modeInOther, (boolean) r5);
|
|
int decoratedMeasurement = this.mOrientationHelper.getDecoratedMeasurement(view);
|
|
if (decoratedMeasurement > i16) {
|
|
i16 = decoratedMeasurement;
|
|
}
|
|
float decoratedMeasurementInOther = (((float) this.mOrientationHelper.getDecoratedMeasurementInOther(view)) * 1.0f) / ((float) ((LayoutParams) view.getLayoutParams()).mSpanSize);
|
|
if (decoratedMeasurementInOther > f) {
|
|
f = decoratedMeasurementInOther;
|
|
}
|
|
i15++;
|
|
r5 = 0;
|
|
}
|
|
if (z2) {
|
|
guessMeasurement(f, i11);
|
|
i16 = 0;
|
|
for (int i20 = 0; i20 < i13; i20++) {
|
|
View view2 = this.mSet[i20];
|
|
measureChild(view2, 1073741824, true);
|
|
int decoratedMeasurement2 = this.mOrientationHelper.getDecoratedMeasurement(view2);
|
|
if (decoratedMeasurement2 > i16) {
|
|
i16 = decoratedMeasurement2;
|
|
}
|
|
}
|
|
}
|
|
for (int i21 = 0; i21 < i13; i21++) {
|
|
View view3 = this.mSet[i21];
|
|
if (this.mOrientationHelper.getDecoratedMeasurement(view3) != i16) {
|
|
LayoutParams layoutParams = (LayoutParams) view3.getLayoutParams();
|
|
Rect rect = layoutParams.mDecorInsets;
|
|
int i22 = rect.top + rect.bottom + ((ViewGroup.MarginLayoutParams) layoutParams).topMargin + ((ViewGroup.MarginLayoutParams) layoutParams).bottomMargin;
|
|
int i23 = rect.left + rect.right + ((ViewGroup.MarginLayoutParams) layoutParams).leftMargin + ((ViewGroup.MarginLayoutParams) layoutParams).rightMargin;
|
|
int spaceForSpanRange = getSpaceForSpanRange(layoutParams.mSpanIndex, layoutParams.mSpanSize);
|
|
if (this.mOrientation == 1) {
|
|
i10 = RecyclerView.LayoutManager.getChildMeasureSpec(spaceForSpanRange, 1073741824, i23, ((ViewGroup.MarginLayoutParams) layoutParams).width, false);
|
|
i9 = View.MeasureSpec.makeMeasureSpec(i16 - i22, 1073741824);
|
|
} else {
|
|
int makeMeasureSpec = View.MeasureSpec.makeMeasureSpec(i16 - i23, 1073741824);
|
|
i9 = RecyclerView.LayoutManager.getChildMeasureSpec(spaceForSpanRange, 1073741824, i22, ((ViewGroup.MarginLayoutParams) layoutParams).height, false);
|
|
i10 = makeMeasureSpec;
|
|
}
|
|
measureChildWithDecorationsAndMargin(view3, i10, i9, true);
|
|
}
|
|
}
|
|
layoutChunkResult.mConsumed = i16;
|
|
if (this.mOrientation == 1) {
|
|
if (layoutState.mLayoutDirection == -1) {
|
|
i3 = layoutState.mOffset;
|
|
i4 = i3 - i16;
|
|
} else {
|
|
int i24 = layoutState.mOffset;
|
|
i3 = i16 + i24;
|
|
i4 = i24;
|
|
}
|
|
i2 = 0;
|
|
i = 0;
|
|
} else if (layoutState.mLayoutDirection == -1) {
|
|
i2 = layoutState.mOffset;
|
|
i = i2 - i16;
|
|
i4 = 0;
|
|
i3 = 0;
|
|
} else {
|
|
i = layoutState.mOffset;
|
|
i2 = i16 + i;
|
|
i3 = 0;
|
|
i4 = 0;
|
|
}
|
|
int i25 = 0;
|
|
while (i25 < i13) {
|
|
View view4 = this.mSet[i25];
|
|
LayoutParams layoutParams2 = (LayoutParams) view4.getLayoutParams();
|
|
if (this.mOrientation != 1) {
|
|
i4 = this.mCachedBorders[layoutParams2.mSpanIndex] + getPaddingTop();
|
|
i3 = this.mOrientationHelper.getDecoratedMeasurementInOther(view4) + i4;
|
|
} else if (isLayoutRTL()) {
|
|
i2 = this.mCachedBorders[this.mSpanCount - layoutParams2.mSpanIndex] + getPaddingLeft();
|
|
i = i2 - this.mOrientationHelper.getDecoratedMeasurementInOther(view4);
|
|
} else {
|
|
int paddingLeft = getPaddingLeft() + this.mCachedBorders[layoutParams2.mSpanIndex];
|
|
i5 = paddingLeft;
|
|
i8 = i4;
|
|
i7 = i3;
|
|
i6 = this.mOrientationHelper.getDecoratedMeasurementInOther(view4) + paddingLeft;
|
|
layoutDecoratedWithMargins(view4, i5, i8, i6, i7);
|
|
if (!layoutParams2.isItemRemoved() || layoutParams2.isItemChanged()) {
|
|
layoutChunkResult.mIgnoreConsumed = true;
|
|
}
|
|
layoutChunkResult.mFocusable |= view4.hasFocusable();
|
|
i25++;
|
|
i4 = i8;
|
|
i3 = i7;
|
|
i2 = i6;
|
|
i = i5;
|
|
}
|
|
i8 = i4;
|
|
i7 = i3;
|
|
i6 = i2;
|
|
i5 = i;
|
|
layoutDecoratedWithMargins(view4, i5, i8, i6, i7);
|
|
if (!layoutParams2.isItemRemoved()) {
|
|
}
|
|
layoutChunkResult.mIgnoreConsumed = true;
|
|
layoutChunkResult.mFocusable |= view4.hasFocusable();
|
|
i25++;
|
|
i4 = i8;
|
|
i3 = i7;
|
|
i2 = i6;
|
|
i = i5;
|
|
}
|
|
Arrays.fill(this.mSet, (Object) null);
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager
|
|
public void onAnchorReady(RecyclerView.Recycler recycler, RecyclerView.State state, LinearLayoutManager.AnchorInfo anchorInfo, int i) {
|
|
super.onAnchorReady(recycler, state, anchorInfo, i);
|
|
updateMeasurements();
|
|
if (state.getItemCount() > 0 && !state.isPreLayout()) {
|
|
ensureAnchorIsInCorrectSpan(recycler, state, anchorInfo, i);
|
|
}
|
|
ensureViewSet();
|
|
}
|
|
|
|
/* JADX WARNING: Code restructure failed: missing block: B:54:0x00d6, code lost:
|
|
if (r13 == (r2 > r15)) goto L_0x00b0;
|
|
*/
|
|
/* JADX WARNING: Code restructure failed: missing block: B:65:0x00f6, code lost:
|
|
if (r13 == r11) goto L_0x00b8;
|
|
*/
|
|
/* JADX WARNING: Removed duplicated region for block: B:71:0x0107 */
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager, androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public View onFocusSearchFailed(View view, int i, RecyclerView.Recycler recycler, RecyclerView.State state) {
|
|
int i2;
|
|
int i3;
|
|
int i4;
|
|
int i5;
|
|
View view2;
|
|
View view3;
|
|
int i6;
|
|
int i7;
|
|
int i8;
|
|
boolean z2;
|
|
RecyclerView.Recycler recycler2 = recycler;
|
|
RecyclerView.State state2 = state;
|
|
View findContainingItemView = findContainingItemView(view);
|
|
View view4 = null;
|
|
if (findContainingItemView == null) {
|
|
return null;
|
|
}
|
|
LayoutParams layoutParams = (LayoutParams) findContainingItemView.getLayoutParams();
|
|
int i9 = layoutParams.mSpanIndex;
|
|
int i10 = layoutParams.mSpanSize + i9;
|
|
if (super.onFocusSearchFailed(view, i, recycler, state) == null) {
|
|
return null;
|
|
}
|
|
if ((convertFocusDirectionToLayoutDirection(i) == 1) != this.mShouldReverseLayout) {
|
|
i4 = getChildCount() - 1;
|
|
i3 = -1;
|
|
i2 = -1;
|
|
} else {
|
|
i3 = getChildCount();
|
|
i4 = 0;
|
|
i2 = 1;
|
|
}
|
|
boolean z3 = this.mOrientation == 1 && isLayoutRTL();
|
|
int spanGroupIndex = getSpanGroupIndex(recycler2, state2, i4);
|
|
int i11 = i4;
|
|
int i12 = 0;
|
|
int i13 = -1;
|
|
int i14 = -1;
|
|
int i15 = 0;
|
|
View view5 = null;
|
|
while (i11 != i3) {
|
|
int spanGroupIndex2 = getSpanGroupIndex(recycler2, state2, i11);
|
|
View childAt = getChildAt(i11);
|
|
if (childAt == findContainingItemView) {
|
|
break;
|
|
}
|
|
if (!childAt.hasFocusable() || spanGroupIndex2 == spanGroupIndex) {
|
|
LayoutParams layoutParams2 = (LayoutParams) childAt.getLayoutParams();
|
|
int i16 = layoutParams2.mSpanIndex;
|
|
view2 = findContainingItemView;
|
|
int i17 = layoutParams2.mSpanSize + i16;
|
|
if (childAt.hasFocusable() && i16 == i9 && i17 == i10) {
|
|
return childAt;
|
|
}
|
|
if ((!childAt.hasFocusable() || view4 != null) && (childAt.hasFocusable() || view5 != null)) {
|
|
view3 = view5;
|
|
int min = Math.min(i17, i10) - Math.max(i16, i9);
|
|
if (childAt.hasFocusable()) {
|
|
if (min <= i12) {
|
|
if (min == i12) {
|
|
}
|
|
}
|
|
} else if (view4 == null) {
|
|
i6 = i12;
|
|
i5 = i3;
|
|
z2 = true;
|
|
if (isViewPartiallyVisible(childAt, false, true)) {
|
|
i7 = i15;
|
|
if (min > i7) {
|
|
i8 = i14;
|
|
if (z2) {
|
|
if (childAt.hasFocusable()) {
|
|
i13 = layoutParams2.mSpanIndex;
|
|
i14 = i8;
|
|
i15 = i7;
|
|
view5 = view3;
|
|
view4 = childAt;
|
|
i12 = Math.min(i17, i10) - Math.max(i16, i9);
|
|
} else {
|
|
int i18 = layoutParams2.mSpanIndex;
|
|
i15 = Math.min(i17, i10) - Math.max(i16, i9);
|
|
i14 = i18;
|
|
i12 = i6;
|
|
view5 = childAt;
|
|
}
|
|
i11 += i2;
|
|
recycler2 = recycler;
|
|
state2 = state;
|
|
findContainingItemView = view2;
|
|
i3 = i5;
|
|
}
|
|
} else {
|
|
if (min == i7) {
|
|
i8 = i14;
|
|
if (i16 <= i8) {
|
|
z2 = false;
|
|
}
|
|
} else {
|
|
i8 = i14;
|
|
}
|
|
z2 = false;
|
|
if (z2) {
|
|
}
|
|
}
|
|
}
|
|
i8 = i14;
|
|
i7 = i15;
|
|
z2 = false;
|
|
if (z2) {
|
|
}
|
|
}
|
|
i6 = i12;
|
|
i5 = i3;
|
|
i8 = i14;
|
|
i7 = i15;
|
|
z2 = false;
|
|
if (z2) {
|
|
}
|
|
} else {
|
|
view3 = view5;
|
|
}
|
|
i6 = i12;
|
|
i5 = i3;
|
|
i8 = i14;
|
|
i7 = i15;
|
|
z2 = true;
|
|
if (z2) {
|
|
}
|
|
} else if (view4 != null) {
|
|
break;
|
|
} else {
|
|
view2 = findContainingItemView;
|
|
view3 = view5;
|
|
i6 = i12;
|
|
i5 = i3;
|
|
i8 = i14;
|
|
i7 = i15;
|
|
}
|
|
i14 = i8;
|
|
i15 = i7;
|
|
i12 = i6;
|
|
view5 = view3;
|
|
i11 += i2;
|
|
recycler2 = recycler;
|
|
state2 = state;
|
|
findContainingItemView = view2;
|
|
i3 = i5;
|
|
}
|
|
return view4 != null ? view4 : view5;
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public void onInitializeAccessibilityNodeInfoForItem(RecyclerView.Recycler recycler, RecyclerView.State state, View view, AccessibilityNodeInfoCompat accessibilityNodeInfoCompat) {
|
|
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
|
|
if (!(layoutParams instanceof LayoutParams)) {
|
|
super.onInitializeAccessibilityNodeInfoForItem(view, accessibilityNodeInfoCompat);
|
|
return;
|
|
}
|
|
LayoutParams layoutParams2 = (LayoutParams) layoutParams;
|
|
int spanGroupIndex = getSpanGroupIndex(recycler, state, layoutParams2.getViewLayoutPosition());
|
|
if (this.mOrientation == 0) {
|
|
accessibilityNodeInfoCompat.setCollectionItemInfo(AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain(layoutParams2.getSpanIndex(), layoutParams2.getSpanSize(), spanGroupIndex, 1, false, false));
|
|
} else {
|
|
accessibilityNodeInfoCompat.setCollectionItemInfo(AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain(spanGroupIndex, 1, layoutParams2.getSpanIndex(), layoutParams2.getSpanSize(), false, false));
|
|
}
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public void onItemsAdded(RecyclerView recyclerView, int i, int i2) {
|
|
this.mSpanSizeLookup.invalidateSpanIndexCache();
|
|
this.mSpanSizeLookup.invalidateSpanGroupIndexCache();
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public void onItemsChanged(RecyclerView recyclerView) {
|
|
this.mSpanSizeLookup.invalidateSpanIndexCache();
|
|
this.mSpanSizeLookup.invalidateSpanGroupIndexCache();
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public void onItemsMoved(RecyclerView recyclerView, int i, int i2, int i3) {
|
|
this.mSpanSizeLookup.invalidateSpanIndexCache();
|
|
this.mSpanSizeLookup.invalidateSpanGroupIndexCache();
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public void onItemsRemoved(RecyclerView recyclerView, int i, int i2) {
|
|
this.mSpanSizeLookup.invalidateSpanIndexCache();
|
|
this.mSpanSizeLookup.invalidateSpanGroupIndexCache();
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public void onItemsUpdated(RecyclerView recyclerView, int i, int i2, Object obj) {
|
|
this.mSpanSizeLookup.invalidateSpanIndexCache();
|
|
this.mSpanSizeLookup.invalidateSpanGroupIndexCache();
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager, androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
|
|
if (state.isPreLayout()) {
|
|
cachePreLayoutSpanMapping();
|
|
}
|
|
super.onLayoutChildren(recycler, state);
|
|
clearPreLayoutSpanMappingCache();
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager, androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public void onLayoutCompleted(RecyclerView.State state) {
|
|
super.onLayoutCompleted(state);
|
|
this.mPendingSpanCountChange = false;
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager, androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public int scrollHorizontallyBy(int i, RecyclerView.Recycler recycler, RecyclerView.State state) {
|
|
updateMeasurements();
|
|
ensureViewSet();
|
|
return super.scrollHorizontallyBy(i, recycler, state);
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager, androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public int scrollVerticallyBy(int i, RecyclerView.Recycler recycler, RecyclerView.State state) {
|
|
updateMeasurements();
|
|
ensureViewSet();
|
|
return super.scrollVerticallyBy(i, recycler, state);
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public void setMeasuredDimension(Rect rect, int i, int i2) {
|
|
int i3;
|
|
int i4;
|
|
if (this.mCachedBorders == null) {
|
|
super.setMeasuredDimension(rect, i, i2);
|
|
}
|
|
int paddingRight = getPaddingRight() + getPaddingLeft();
|
|
int paddingBottom = getPaddingBottom() + getPaddingTop();
|
|
if (this.mOrientation == 1) {
|
|
i4 = RecyclerView.LayoutManager.chooseSize(i2, rect.height() + paddingBottom, getMinimumHeight());
|
|
int[] iArr = this.mCachedBorders;
|
|
i3 = RecyclerView.LayoutManager.chooseSize(i, iArr[iArr.length - 1] + paddingRight, getMinimumWidth());
|
|
} else {
|
|
i3 = RecyclerView.LayoutManager.chooseSize(i, rect.width() + paddingRight, getMinimumWidth());
|
|
int[] iArr2 = this.mCachedBorders;
|
|
i4 = RecyclerView.LayoutManager.chooseSize(i2, iArr2[iArr2.length - 1] + paddingBottom, getMinimumHeight());
|
|
}
|
|
setMeasuredDimension(i3, i4);
|
|
}
|
|
|
|
public void setSpanCount(int i) {
|
|
if (i != this.mSpanCount) {
|
|
this.mPendingSpanCountChange = true;
|
|
if (i >= 1) {
|
|
this.mSpanCount = i;
|
|
this.mSpanSizeLookup.invalidateSpanIndexCache();
|
|
requestLayout();
|
|
return;
|
|
}
|
|
throw new IllegalArgumentException(a.j("Span count should be at least 1. Provided ", i));
|
|
}
|
|
}
|
|
|
|
public void setSpanSizeLookup(SpanSizeLookup spanSizeLookup) {
|
|
this.mSpanSizeLookup = spanSizeLookup;
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager
|
|
public void setStackFromEnd(boolean z2) {
|
|
if (!z2) {
|
|
super.setStackFromEnd(false);
|
|
return;
|
|
}
|
|
throw new UnsupportedOperationException("GridLayoutManager does not support stack from end. Consider using reverse layout");
|
|
}
|
|
|
|
public void setUsingSpansToEstimateScrollbarDimensions(boolean z2) {
|
|
this.mUsingSpansToEstimateScrollBarDimensions = z2;
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.LinearLayoutManager, androidx.recyclerview.widget.RecyclerView.LayoutManager
|
|
public boolean supportsPredictiveItemAnimations() {
|
|
return this.mPendingSavedState == null && !this.mPendingSpanCountChange;
|
|
}
|
|
}
|