mirror of
https://github.com/alibaba/vlayout.git
synced 2026-10-16 20:51:03 +08:00
Fix mSpans in StaggeredGridLayoutHelper may be null cause exception.
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
+42
-27
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user