diff --git a/examples/src/main/java/com/alibaba/android/vlayout/example/VLayoutActivity.java b/examples/src/main/java/com/alibaba/android/vlayout/example/VLayoutActivity.java index dca43f00..daeb7975 100644 --- a/examples/src/main/java/com/alibaba/android/vlayout/example/VLayoutActivity.java +++ b/examples/src/main/java/com/alibaba/android/vlayout/example/VLayoutActivity.java @@ -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(); diff --git a/gradle.properties b/gradle.properties index 583f884d..e530dc52 100644 --- a/gradle.properties +++ b/gradle.properties @@ -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 diff --git a/vlayout/src/main/java/com/alibaba/android/vlayout/layout/StaggeredGridLayoutHelper.java b/vlayout/src/main/java/com/alibaba/android/vlayout/layout/StaggeredGridLayoutHelper.java index 265b1a4e..42c27d2d 100644 --- a/vlayout/src/main/java/com/alibaba/android/vlayout/layout/StaggeredGridLayoutHelper.java +++ b/vlayout/src/main/java/com/alibaba/android/vlayout/layout/StaggeredGridLayoutHelper.java @@ -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) { @@ -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(); @@ -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); + } } } @@ -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)) { @@ -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(); + } } } } @@ -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)); + } } } } @@ -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); + } } } }