Skip to content
This repository has been archived by the owner on Jul 14, 2021. It is now read-only.

Commit

Permalink
Fix mSpans in StaggeredGridLayoutHelper may be null cause exception.
Browse files Browse the repository at this point in the history
  • Loading branch information
MikeAfc committed Dec 16, 2019
1 parent dacf54f commit b7f4642
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 103 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -319,81 +319,81 @@ public void onBindViewHolder(MainViewHolder holder, int position) {
});
}

{
RangeGridLayoutHelper layoutHelper = new RangeGridLayoutHelper(4);
layoutHelper.setBgColor(Color.GREEN);
layoutHelper.setWeights(new float[]{20f, 26.665f});
layoutHelper.setPadding(15, 15, 15, 15);
layoutHelper.setMargin(15, 50, 15, 150);
layoutHelper.setHGap(10);
layoutHelper.setVGap(10);
GridRangeStyle rangeStyle = new GridRangeStyle();
rangeStyle.setBgColor(Color.RED);
rangeStyle.setSpanCount(2);
rangeStyle.setWeights(new float[]{46.665f});
rangeStyle.setPadding(15, 15, 15, 15);
rangeStyle.setMargin(15, 15, 15, 15);
rangeStyle.setHGap(5);
rangeStyle.setVGap(5);
layoutHelper.addRangeStyle(0, 7, rangeStyle);

GridRangeStyle rangeStyle1 = new GridRangeStyle();
rangeStyle1.setBgColor(Color.YELLOW);
rangeStyle1.setSpanCount(2);
rangeStyle1.setWeights(new float[]{46.665f});
rangeStyle1.setPadding(15, 15, 15, 15);
rangeStyle1.setMargin(15, 15, 15, 15);
rangeStyle1.setHGap(5);
rangeStyle1.setVGap(5);
layoutHelper.addRangeStyle(8, 15, rangeStyle1);

GridRangeStyle rangeStyle2 = new GridRangeStyle();
rangeStyle2.setBgColor(Color.CYAN);
rangeStyle2.setSpanCount(2);
rangeStyle2.setWeights(new float[]{46.665f});
rangeStyle2.setPadding(15, 15, 15, 15);
rangeStyle2.setMargin(15, 15, 15, 15);
rangeStyle2.setHGap(5);
rangeStyle2.setVGap(5);
layoutHelper.addRangeStyle(16, 22, rangeStyle2);
GridRangeStyle rangeStyle3 = new GridRangeStyle();
rangeStyle3.setBgColor(Color.DKGRAY);
rangeStyle3.setSpanCount(1);
rangeStyle3.setWeights(new float[]{46.665f});
rangeStyle3.setPadding(15, 15, 15, 15);
rangeStyle3.setMargin(15, 15, 15, 15);
rangeStyle3.setHGap(5);
rangeStyle3.setVGap(5);
rangeStyle2.addChildRangeStyle(0, 2, rangeStyle3);
GridRangeStyle rangeStyle4 = new GridRangeStyle();
rangeStyle4.setBgColor(Color.BLUE);
rangeStyle4.setSpanCount(2);
rangeStyle4.setWeights(new float[]{46.665f});
rangeStyle4.setPadding(15, 15, 15, 15);
rangeStyle4.setMargin(15, 15, 15, 15);
rangeStyle4.setHGap(5);
rangeStyle4.setVGap(5);
rangeStyle2.addChildRangeStyle(3, 6, rangeStyle4);

GridRangeStyle rangeStyle5 = new GridRangeStyle();
rangeStyle5.setBgColor(Color.RED);
rangeStyle5.setSpanCount(2);
rangeStyle5.setPadding(15, 15, 15, 15);
rangeStyle5.setMargin(15, 15, 15, 15);
rangeStyle5.setHGap(5);
rangeStyle5.setVGap(5);
layoutHelper.addRangeStyle(23, 30, rangeStyle5);
GridRangeStyle rangeStyle6 = new GridRangeStyle();
rangeStyle6.setBgColor(Color.MAGENTA);
rangeStyle6.setSpanCount(2);
rangeStyle6.setPadding(15, 15, 15, 15);
rangeStyle6.setMargin(15, 15, 15, 15);
rangeStyle6.setHGap(5);
rangeStyle6.setVGap(5);
rangeStyle5.addChildRangeStyle(0, 7, rangeStyle6);

adapters.add(new SubAdapter(this, layoutHelper, 23));
}
// {
// RangeGridLayoutHelper layoutHelper = new RangeGridLayoutHelper(4);
// layoutHelper.setBgColor(Color.GREEN);
// layoutHelper.setWeights(new float[]{20f, 26.665f});
// layoutHelper.setPadding(15, 15, 15, 15);
// layoutHelper.setMargin(15, 50, 15, 150);
// layoutHelper.setHGap(10);
// layoutHelper.setVGap(10);
// GridRangeStyle rangeStyle = new GridRangeStyle();
// rangeStyle.setBgColor(Color.RED);
// rangeStyle.setSpanCount(2);
// rangeStyle.setWeights(new float[]{46.665f});
// rangeStyle.setPadding(15, 15, 15, 15);
// rangeStyle.setMargin(15, 15, 15, 15);
// rangeStyle.setHGap(5);
// rangeStyle.setVGap(5);
// layoutHelper.addRangeStyle(0, 7, rangeStyle);
//
// GridRangeStyle rangeStyle1 = new GridRangeStyle();
// rangeStyle1.setBgColor(Color.YELLOW);
// rangeStyle1.setSpanCount(2);
// rangeStyle1.setWeights(new float[]{46.665f});
// rangeStyle1.setPadding(15, 15, 15, 15);
// rangeStyle1.setMargin(15, 15, 15, 15);
// rangeStyle1.setHGap(5);
// rangeStyle1.setVGap(5);
// layoutHelper.addRangeStyle(8, 15, rangeStyle1);
//
// GridRangeStyle rangeStyle2 = new GridRangeStyle();
// rangeStyle2.setBgColor(Color.CYAN);
// rangeStyle2.setSpanCount(2);
// rangeStyle2.setWeights(new float[]{46.665f});
// rangeStyle2.setPadding(15, 15, 15, 15);
// rangeStyle2.setMargin(15, 15, 15, 15);
// rangeStyle2.setHGap(5);
// rangeStyle2.setVGap(5);
// layoutHelper.addRangeStyle(16, 22, rangeStyle2);
// GridRangeStyle rangeStyle3 = new GridRangeStyle();
// rangeStyle3.setBgColor(Color.DKGRAY);
// rangeStyle3.setSpanCount(1);
// rangeStyle3.setWeights(new float[]{46.665f});
// rangeStyle3.setPadding(15, 15, 15, 15);
// rangeStyle3.setMargin(15, 15, 15, 15);
// rangeStyle3.setHGap(5);
// rangeStyle3.setVGap(5);
// rangeStyle2.addChildRangeStyle(0, 2, rangeStyle3);
// GridRangeStyle rangeStyle4 = new GridRangeStyle();
// rangeStyle4.setBgColor(Color.BLUE);
// rangeStyle4.setSpanCount(2);
// rangeStyle4.setWeights(new float[]{46.665f});
// rangeStyle4.setPadding(15, 15, 15, 15);
// rangeStyle4.setMargin(15, 15, 15, 15);
// rangeStyle4.setHGap(5);
// rangeStyle4.setVGap(5);
// rangeStyle2.addChildRangeStyle(3, 6, rangeStyle4);
//
// GridRangeStyle rangeStyle5 = new GridRangeStyle();
// rangeStyle5.setBgColor(Color.RED);
// rangeStyle5.setSpanCount(2);
// rangeStyle5.setPadding(15, 15, 15, 15);
// rangeStyle5.setMargin(15, 15, 15, 15);
// rangeStyle5.setHGap(5);
// rangeStyle5.setVGap(5);
// layoutHelper.addRangeStyle(23, 30, rangeStyle5);
// GridRangeStyle rangeStyle6 = new GridRangeStyle();
// rangeStyle6.setBgColor(Color.MAGENTA);
// rangeStyle6.setSpanCount(2);
// rangeStyle6.setPadding(15, 15, 15, 15);
// rangeStyle6.setMargin(15, 15, 15, 15);
// rangeStyle6.setHGap(5);
// rangeStyle6.setVGap(5);
// rangeStyle5.addChildRangeStyle(0, 7, rangeStyle6);
//
// adapters.add(new SubAdapter(this, layoutHelper, 23));
// }

{
SingleLayoutHelper layoutHelper = new SingleLayoutHelper();
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
GROUP=com.alibaba.android
ARTIFACT=vlayout
VERSION=1
VERSION_NAME=1.2.33
VERSION_NAME=1.2.36
PACKAGING_TYPE=aar
useNewSupportLibrary=true
systemProp.compileSdkVersion=26
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,7 @@ public void layoutViews(RecyclerView.Recycler recycler, RecyclerView.State state
handleStateOnResult(result, view);
}

if (isOutOfRange(layoutState.getCurrentPosition())) {
if (isOutOfRange(layoutState.getCurrentPosition()) && mSpans != null) {
// reach the end of layout, cache the gap
// TODO: how to retain gap
if (layoutState.getLayoutDirection() == LayoutStateWrapper.LAYOUT_START) {
Expand Down Expand Up @@ -596,9 +596,11 @@ private void checkForGaps() {
//FIXME do not clear loopup, may cause lane error while scroll
//mLazySpanLookup.clear();

for (int i = 0, size = mSpans.length; i < size; i++) {
Span span = mSpans[i];
span.setLine(alignLine);
if (mSpans != null) {
for (int i = 0, size = mSpans.length; i < size; i++) {
Span span = mSpans[i];
span.setLine(alignLine);
}
}

layoutManager.requestSimpleAnimationsInNextLayout();
Expand All @@ -622,10 +624,12 @@ private View hasGapsToFix(VirtualLayoutManager layoutManager, final int position
BitSet mSpansToCheck = new BitSet(mNumLanes);
mSpansToCheck.set(0, mNumLanes, true);

for (int i = 0, size = mSpans.length; i < size; i++) {
Span span = mSpans[i];
if (span.mViews.size() != 0 && checkSpanForGap(span, layoutManager, alignLine)) {
return layoutManager.getReverseLayout() ? span.mViews.get(span.mViews.size() - 1) : span.mViews.get(0);
if (mSpans != null) {
for (int i = 0, size = mSpans.length; i < size; i++) {
Span span = mSpans[i];
if (span.mViews.size() != 0 && checkSpanForGap(span, layoutManager, alignLine)) {
return layoutManager.getReverseLayout() ? span.mViews.get(span.mViews.size() - 1) : span.mViews.get(0);
}
}
}

Expand Down Expand Up @@ -709,6 +713,9 @@ private void recycleFromEnd(RecyclerView.Recycler recycler, int line, LayoutMana

private Span findSpan(int position, View child, boolean isStart) {
int span = mLazySpanLookup.getSpan(position);
if (mSpans == null){
return null;
}
if (span >= 0 && span < mSpans.length) {
Span sp = mSpans[span];
if (isStart && sp.findStart(child)) {
Expand Down Expand Up @@ -930,9 +937,11 @@ public void onRefreshLayout(RecyclerView.State state, VirtualLayoutManager.Ancho
if (BuildConfig.DEBUG) {
Log.d(TAG, "onRefreshLayout span.clear()");
}
for (int i = 0, size = mSpans.length; i < size; i++) {
Span span = mSpans[i];
span.clear();
if (mSpans != null) {
for (int i = 0, size = mSpans.length; i < size; i++) {
Span span = mSpans[i];
span.clear();
}
}
}
}
Expand Down Expand Up @@ -964,22 +973,26 @@ public void checkAnchorInfo(RecyclerView.State state, VirtualLayoutManager.Ancho
if (BuildConfig.DEBUG) {
Log.d(TAG, "checkAnchorInfo span.clear()");
}
for (int i = 0, size = mSpans.length; i < size; i++) {
Span span = mSpans[i];
span.clear();
span.setLine(anchorInfo.coordinate);
if (mSpans != null) {
for (int i = 0, size = mSpans.length; i < size; i++) {
Span span = mSpans[i];
span.clear();
span.setLine(anchorInfo.coordinate);
}
}
} else {
int anchorPos = anchorInfo.layoutFromEnd ? Integer.MIN_VALUE : Integer.MAX_VALUE;
for (int i = 0, size = mSpans.length; i < size; i++) {
Span span = mSpans[i];
if (!span.mViews.isEmpty()) {
if (anchorInfo.layoutFromEnd) {
View view = span.mViews.get(span.mViews.size() - 1);
anchorPos = Math.max(anchorPos, helper.getPosition(view));
} else {
View view = span.mViews.get(0);
anchorPos = Math.min(anchorPos, helper.getPosition(view));
if (mSpans != null) {
for (int i = 0, size = mSpans.length; i < size; i++) {
Span span = mSpans[i];
if (!span.mViews.isEmpty()) {
if (anchorInfo.layoutFromEnd) {
View view = span.mViews.get(span.mViews.size() - 1);
anchorPos = Math.max(anchorPos, helper.getPosition(view));
} else {
View view = span.mViews.get(0);
anchorPos = Math.min(anchorPos, helper.getPosition(view));
}
}
}
}
Expand Down Expand Up @@ -1024,9 +1037,11 @@ public void checkAnchorInfo(RecyclerView.State state, VirtualLayoutManager.Ancho
if (BuildConfig.DEBUG) {
Log.d(TAG, "checkAnchorInfo span.cacheReferenceLineAndClear()");
}
for (int i = 0, size = mSpans.length; i < size; i++) {
Span span = mSpans[i];
span.cacheReferenceLineAndClear(helper.getReverseLayout() ^ anchorInfo.layoutFromEnd, offset, orientationHelper);
if (mSpans != null) {
for (int i = 0, size = mSpans.length; i < size; i++) {
Span span = mSpans[i];
span.cacheReferenceLineAndClear(helper.getReverseLayout() ^ anchorInfo.layoutFromEnd, offset, orientationHelper);
}
}
}
}
Expand Down

0 comments on commit b7f4642

Please sign in to comment.