Fix mSpans in StaggeredGridLayoutHelper may be null cause exception.

This commit is contained in:
MikeAfc
2019-12-16 16:29:23 +08:00
parent dacf54f791
commit b7f46425e7
3 changed files with 118 additions and 103 deletions
@@ -319,81 +319,81 @@ public class VLayoutActivity extends Activity {
});
}
{
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();
+1 -1
View File
@@ -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
@@ -355,7 +355,7 @@ public class StaggeredGridLayoutHelper extends BaseLayoutHelper {
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) {
@@ -596,9 +596,11 @@ public class StaggeredGridLayoutHelper extends BaseLayoutHelper {
//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();
@@ -622,10 +624,12 @@ public class StaggeredGridLayoutHelper extends BaseLayoutHelper {
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);
}
}
}
@@ -709,6 +713,9 @@ public class StaggeredGridLayoutHelper extends BaseLayoutHelper {
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)) {
@@ -930,9 +937,11 @@ public class StaggeredGridLayoutHelper extends BaseLayoutHelper {
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();
}
}
}
}
@@ -964,22 +973,26 @@ public class StaggeredGridLayoutHelper extends BaseLayoutHelper {
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));
}
}
}
}
@@ -1024,9 +1037,11 @@ public class StaggeredGridLayoutHelper extends BaseLayoutHelper {
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);
}
}
}
}