From 1f6f8c8049a78bc101222f625711ad174b52c059 Mon Sep 17 00:00:00 2001 From: longerian Date: Wed, 16 May 2018 19:48:50 +0800 Subject: [PATCH 01/12] add performance monitor api --- .../vlayout/example/VLayoutActivity.java | 16 ++++++ .../android/vlayout/VirtualLayoutManager.java | 31 +++++++++++ .../vlayout/extend/PerformanceMonitor.java | 52 +++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 vlayout/src/main/java/com/alibaba/android/vlayout/extend/PerformanceMonitor.java 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 c6f49441..d17b5522 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 @@ -29,6 +29,7 @@ import com.alibaba.android.vlayout.RecyclablePagerAdapter; import com.alibaba.android.vlayout.VirtualLayoutManager; import com.alibaba.android.vlayout.VirtualLayoutManager.LayoutParams; +import com.alibaba.android.vlayout.extend.PerformanceMonitor; import com.alibaba.android.vlayout.layout.ColumnLayoutHelper; import com.alibaba.android.vlayout.layout.FixLayoutHelper; import com.alibaba.android.vlayout.layout.FloatLayoutHelper; @@ -119,7 +120,22 @@ protected void onCreate(Bundle savedInstanceState) { final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.main_view); final VirtualLayoutManager layoutManager = new VirtualLayoutManager(this); + layoutManager.setPerformanceMonitor(new PerformanceMonitor() { + long start; + long end; + + @Override + public void recordStart(String phase, View view) { + start = System.currentTimeMillis(); + } + + @Override + public void recordEnd(String phase, View view) { + end = System.currentTimeMillis(); + Log.d("VLayoutActivity", view.getClass().getName() + " " + (end - start)); + } + }); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int scrollState) { diff --git a/vlayout/src/main/java/com/alibaba/android/vlayout/VirtualLayoutManager.java b/vlayout/src/main/java/com/alibaba/android/vlayout/VirtualLayoutManager.java index fa29833b..93c266c4 100644 --- a/vlayout/src/main/java/com/alibaba/android/vlayout/VirtualLayoutManager.java +++ b/vlayout/src/main/java/com/alibaba/android/vlayout/VirtualLayoutManager.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Map; +import com.alibaba.android.vlayout.extend.PerformanceMonitor; import com.alibaba.android.vlayout.layout.BaseLayoutHelper; import com.alibaba.android.vlayout.layout.DefaultLayoutHelper; import com.alibaba.android.vlayout.layout.FixAreaAdjuster; @@ -67,6 +68,8 @@ public class VirtualLayoutManager extends ExposeLinearLayoutManagerEx implements LayoutManagerHelper { protected static final String TAG = "VirtualLayoutManager"; + private static final String PHASE_MEASURE = "measure"; + private static final String PHASE_LAYOUT = "layout"; private static final String TRACE_LAYOUT = "VLM onLayoutChildren"; private static final String TRACE_SCROLL = "VLM scroll"; @@ -94,6 +97,7 @@ public static void enableDebugging(boolean isDebug) { private int mMaxMeasureSize = -1; + private PerformanceMonitor mPerformanceMonitor; public VirtualLayoutManager(@NonNull final Context context) { this(context, VERTICAL); @@ -121,6 +125,9 @@ public VirtualLayoutManager(@NonNull final Context context, int orientation, boo setHelperFinder(new RangeLayoutHelperFinder()); } + public void setPerformanceMonitor(PerformanceMonitor performanceMonitor) { + mPerformanceMonitor = performanceMonitor; + } public void setNoScrolling(boolean noScrolling) { this.mNoScrolling = noScrolling; @@ -1265,14 +1272,26 @@ public boolean canScrollVertically() { @Override public void layoutChildWithMargins(View child, int left, int top, int right, int bottom) { final ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) child.getLayoutParams(); + if (mPerformanceMonitor != null) { + mPerformanceMonitor.recordStart(PHASE_LAYOUT, child); + } layoutDecorated(child, left + lp.leftMargin, top + lp.topMargin, right - lp.rightMargin, bottom - lp.bottomMargin); + if (mPerformanceMonitor != null) { + mPerformanceMonitor.recordEnd(PHASE_LAYOUT, child); + } } @Override public void layoutChild(View child, int left, int top, int right, int bottom) { + if (mPerformanceMonitor != null) { + mPerformanceMonitor.recordStart(PHASE_LAYOUT, child); + } layoutDecorated(child, left, top, right, bottom); + if (mPerformanceMonitor != null) { + mPerformanceMonitor.recordEnd(PHASE_LAYOUT, child); + } } @Override @@ -1390,7 +1409,13 @@ private void measureChildWithDecorations(View child, int widthSpec, int heightSp calculateItemDecorationsForChild(child, mDecorInsets); widthSpec = updateSpecWithExtra(widthSpec, mDecorInsets.left, mDecorInsets.right); heightSpec = updateSpecWithExtra(heightSpec, mDecorInsets.top, mDecorInsets.bottom); + if (mPerformanceMonitor != null) { + mPerformanceMonitor.recordStart(PHASE_MEASURE, child); + } child.measure(widthSpec, heightSpec); + if (mPerformanceMonitor != null) { + mPerformanceMonitor.recordEnd(PHASE_MEASURE, child); + } } private void measureChildWithDecorationsAndMargin(View child, int widthSpec, int heightSpec) { @@ -1405,7 +1430,13 @@ private void measureChildWithDecorationsAndMargin(View child, int widthSpec, int heightSpec = updateSpecWithExtra(heightSpec, mDecorInsets.top, mDecorInsets.bottom); } + if (mPerformanceMonitor != null) { + mPerformanceMonitor.recordStart(PHASE_MEASURE, child); + } child.measure(widthSpec, heightSpec); + if (mPerformanceMonitor != null) { + mPerformanceMonitor.recordEnd(PHASE_MEASURE, child); + } } /** diff --git a/vlayout/src/main/java/com/alibaba/android/vlayout/extend/PerformanceMonitor.java b/vlayout/src/main/java/com/alibaba/android/vlayout/extend/PerformanceMonitor.java new file mode 100644 index 00000000..b28c0e06 --- /dev/null +++ b/vlayout/src/main/java/com/alibaba/android/vlayout/extend/PerformanceMonitor.java @@ -0,0 +1,52 @@ +package com.alibaba.android.vlayout.extend; + +import android.view.View; + +/** + * Add callback during measure and layout, help you to monitor your view's performance.
+ * Designed as Class instead of Interface is able to extend api in future.
+ * + * Created by longerian on 2018/5/16. + * + * @author longerian + * @date 2018/05/16 + */ +public class PerformanceMonitor { + + /** + * Record the start time + * @param phase + * @param viewType + */ + public void recordStart(String phase, String viewType) { + + } + + /** + * Record the end time + * @param phase + * @param viewType + */ + public void recordEnd(String phase, String viewType) { + + } + + /** + * Record the start time + * @param phase + * @param view + */ + public void recordStart(String phase, View view) { + + } + + /** + * Record the end time + * @param phase + * @param view + */ + public void recordEnd(String phase, View view) { + + } + +} From 1677d73175dc5b73a2ccee4d5cf6b753f11b308b Mon Sep 17 00:00:00 2001 From: longerian Date: Wed, 16 May 2018 19:49:36 +0800 Subject: [PATCH 02/12] update version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 021f2cc5..7c3adaae 100644 --- a/gradle.properties +++ b/gradle.properties @@ -44,7 +44,7 @@ GROUP=com.alibaba.android ARTIFACT=vlayout VERSION=1 -VERSION_NAME=1.2.13 +VERSION_NAME=1.2.14 PACKAGING_TYPE=aar useNewSupportLibrary=true systemProp.compileSdkVersion=25 From dd6446f33dc685181b122d63c8d9891f68a4dd4b Mon Sep 17 00:00:00 2001 From: longerian Date: Thu, 17 May 2018 18:55:12 +0800 Subject: [PATCH 03/12] update version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 7c3adaae..3b396667 100644 --- a/gradle.properties +++ b/gradle.properties @@ -44,7 +44,7 @@ GROUP=com.alibaba.android ARTIFACT=vlayout VERSION=1 -VERSION_NAME=1.2.14 +VERSION_NAME=1.3.0 PACKAGING_TYPE=aar useNewSupportLibrary=true systemProp.compileSdkVersion=25 From 75b4c7c02bb95d05744744f2b82d76e6254c3d91 Mon Sep 17 00:00:00 2001 From: longerian Date: Thu, 17 May 2018 19:01:52 +0800 Subject: [PATCH 04/12] Revert "update version" This reverts commit dd6446f33dc685181b122d63c8d9891f68a4dd4b. --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 3b396667..7c3adaae 100644 --- a/gradle.properties +++ b/gradle.properties @@ -44,7 +44,7 @@ GROUP=com.alibaba.android ARTIFACT=vlayout VERSION=1 -VERSION_NAME=1.3.0 +VERSION_NAME=1.2.14 PACKAGING_TYPE=aar useNewSupportLibrary=true systemProp.compileSdkVersion=25 From 07304ddfc689a7459f0e037ac756aa9d77f48c9b Mon Sep 17 00:00:00 2001 From: longerian Date: Tue, 22 May 2018 13:13:58 +0800 Subject: [PATCH 05/12] add keep for api --- gradle.properties | 2 +- .../alibaba/android/vlayout/extend/PerformanceMonitor.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 7c3adaae..2b1f3026 100644 --- a/gradle.properties +++ b/gradle.properties @@ -44,7 +44,7 @@ GROUP=com.alibaba.android ARTIFACT=vlayout VERSION=1 -VERSION_NAME=1.2.14 +VERSION_NAME=1.2.15 PACKAGING_TYPE=aar useNewSupportLibrary=true systemProp.compileSdkVersion=25 diff --git a/vlayout/src/main/java/com/alibaba/android/vlayout/extend/PerformanceMonitor.java b/vlayout/src/main/java/com/alibaba/android/vlayout/extend/PerformanceMonitor.java index b28c0e06..7c4ec661 100644 --- a/vlayout/src/main/java/com/alibaba/android/vlayout/extend/PerformanceMonitor.java +++ b/vlayout/src/main/java/com/alibaba/android/vlayout/extend/PerformanceMonitor.java @@ -1,5 +1,6 @@ package com.alibaba.android.vlayout.extend; +import android.support.annotation.Keep; import android.view.View; /** @@ -18,6 +19,7 @@ public class PerformanceMonitor { * @param phase * @param viewType */ + @Keep public void recordStart(String phase, String viewType) { } @@ -27,6 +29,7 @@ public void recordStart(String phase, String viewType) { * @param phase * @param viewType */ + @Keep public void recordEnd(String phase, String viewType) { } @@ -36,6 +39,7 @@ public void recordEnd(String phase, String viewType) { * @param phase * @param view */ + @Keep public void recordStart(String phase, View view) { } @@ -45,6 +49,7 @@ public void recordStart(String phase, View view) { * @param phase * @param view */ + @Keep public void recordEnd(String phase, View view) { } From ba9a68198e65c753a4bc0af1cb5496efd76dbb0a Mon Sep 17 00:00:00 2001 From: MikeAfc Date: Thu, 21 Jun 2018 10:05:33 +0800 Subject: [PATCH 06/12] Add interface to control can scroll feature. --- .../android/vlayout/VirtualLayoutManager.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/vlayout/src/main/java/com/alibaba/android/vlayout/VirtualLayoutManager.java b/vlayout/src/main/java/com/alibaba/android/vlayout/VirtualLayoutManager.java index 93c266c4..9e1cf60a 100644 --- a/vlayout/src/main/java/com/alibaba/android/vlayout/VirtualLayoutManager.java +++ b/vlayout/src/main/java/com/alibaba/android/vlayout/VirtualLayoutManager.java @@ -93,6 +93,10 @@ public static void enableDebugging(boolean isDebug) { private boolean mNestedScrolling = false; + private boolean mCanScrollHorizontally; + + private boolean mCanScrollVertically; + private boolean mEnableMarginOverlapping = false; private int mMaxMeasureSize = -1; @@ -122,6 +126,8 @@ public VirtualLayoutManager(@NonNull final Context context, int orientation, boo super(context, orientation, reverseLayout); this.mOrientationHelper = OrientationHelperEx.createOrientationHelper(this, orientation); this.mSecondaryOrientationHelper = OrientationHelperEx.createOrientationHelper(this, orientation == VERTICAL ? HORIZONTAL : VERTICAL); + this.mCanScrollVertically = super.canScrollVertically(); + this.mCanScrollHorizontally = super.canScrollHorizontally(); setHelperFinder(new RangeLayoutHelperFinder()); } @@ -136,6 +142,14 @@ public void setNoScrolling(boolean noScrolling) { mSpaceMeasuring = false; } + public void setCanScrollVertically(boolean canScrollVertically) { + this.mCanScrollVertically = canScrollVertically; + } + + public void setCanScrollHorizontally(boolean canScrollHorizontally) { + this.mCanScrollHorizontally = canScrollHorizontally; + } + public void setNestedScrolling(boolean nestedScrolling) { setNestedScrolling(nestedScrolling, -1); } @@ -1261,12 +1275,12 @@ public int getChildMeasureSpec(int parentSize, int size, boolean canScroll) { @Override public boolean canScrollHorizontally() { - return super.canScrollHorizontally() && !mNoScrolling; + return mCanScrollHorizontally && !mNoScrolling; } @Override public boolean canScrollVertically() { - return super.canScrollVertically() && !mNoScrolling; + return mCanScrollVertically && !mNoScrolling; } @Override From 42bc30af3aec4b4121b718364e8efcfbefe87613 Mon Sep 17 00:00:00 2001 From: MikeAfc Date: Thu, 21 Jun 2018 10:14:58 +0800 Subject: [PATCH 07/12] Update version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 2b1f3026..242d0a21 100644 --- a/gradle.properties +++ b/gradle.properties @@ -44,7 +44,7 @@ GROUP=com.alibaba.android ARTIFACT=vlayout VERSION=1 -VERSION_NAME=1.2.15 +VERSION_NAME=1.2.16 PACKAGING_TYPE=aar useNewSupportLibrary=true systemProp.compileSdkVersion=25 From d6762ac00d4a57df852520529a94ad36925a18ef Mon Sep 17 00:00:00 2001 From: MikeAfc Date: Thu, 26 Jul 2018 16:24:45 +0800 Subject: [PATCH 08/12] Update README.md --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index 772b8b01..76b41b7f 100644 --- a/README.md +++ b/README.md @@ -168,9 +168,3 @@ Before you open an issue or create a pull request, please read [Contributing Gui # LICENSE Vlayout is available under the MIT license. - -# WeChatGroup - -![](https://img.alicdn.com/tfs/TB11_2_kbSYBuNjSspiXXXNzpXa-167-167.png) - -Search `tangram_` or scan the QR code above to be invited in WeChat. From 8ec24f12e8d896fb56ac921efe7ff37f4d29cd4b Mon Sep 17 00:00:00 2001 From: MikeAfc Date: Thu, 26 Jul 2018 16:25:36 +0800 Subject: [PATCH 09/12] Update README-ch.md --- README-ch.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README-ch.md b/README-ch.md index c34404b0..0425c1f2 100644 --- a/README-ch.md +++ b/README-ch.md @@ -169,9 +169,3 @@ recycler.setAdapter(myAdapter); # 开源许可证 vlayout遵循MIT开源许可证协议。 - -# 微信群 - -![](https://img.alicdn.com/tfs/TB11_2_kbSYBuNjSspiXXXNzpXa-167-167.png) - -搜索 `tangram_` 或者扫描以上二维码添加 Tangram 为好友,以便我们邀请你入群。 From a3da84d0faee49558338f2d4216de8b651315021 Mon Sep 17 00:00:00 2001 From: MikeAfc Date: Mon, 30 Jul 2018 15:14:13 +0800 Subject: [PATCH 10/12] Fix reverse cantor not correct. Fix #358, Fix #344 --- .../src/main/java/com/alibaba/android/vlayout/Cantor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vlayout/src/main/java/com/alibaba/android/vlayout/Cantor.java b/vlayout/src/main/java/com/alibaba/android/vlayout/Cantor.java index 73b2d7e8..1729b0b4 100644 --- a/vlayout/src/main/java/com/alibaba/android/vlayout/Cantor.java +++ b/vlayout/src/main/java/com/alibaba/android/vlayout/Cantor.java @@ -28,11 +28,11 @@ public static void reverseCantor(long cantor, long[] result) { result = new long[2]; } // reverse Cantor Function - int w = (int) (Math.floor(Math.sqrt(8 * cantor + 1) - 1) / 2); - int t = (w * w + w) / 2; + long w = (long) (Math.floor(Math.sqrt(8 * cantor + 1) - 1) / 2); + long t = (w * w + w) / 2; - int k2 = (int)(cantor - t); - int k1 = w - k2; + long k2 = cantor - t; + long k1 = w - k2; result[0] = k1; result[1] = k2; } From 7e08f2e659a64b347a1369314ef81e6adcec2cd5 Mon Sep 17 00:00:00 2001 From: MikeAfc Date: Tue, 31 Jul 2018 15:21:26 +0800 Subject: [PATCH 11/12] Update version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 242d0a21..994ff7ac 100644 --- a/gradle.properties +++ b/gradle.properties @@ -44,7 +44,7 @@ GROUP=com.alibaba.android ARTIFACT=vlayout VERSION=1 -VERSION_NAME=1.2.16 +VERSION_NAME=1.2.17 PACKAGING_TYPE=aar useNewSupportLibrary=true systemProp.compileSdkVersion=25 From dd743167e697aece8f181183bee37e12805b04b6 Mon Sep 17 00:00:00 2001 From: budao Date: Wed, 23 Jan 2019 12:11:55 +0800 Subject: [PATCH 12/12] =?UTF-8?q?=E5=85=B3=E9=94=AE=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E4=B8=8BLayoutHelpers=E7=9B=B8=E5=85=B3=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.LinkedList的高效遍历,复杂度降低一个数量级,在2000+元素个数下无卡顿 2.排序过程简化,复用中间数组 3.二分搜索避免LinkedList的get频繁调用,复用数组根据索引直接定位 --- .../vlayout/RangeLayoutHelperFinder.java | 27 ++-- .../android/vlayout/VirtualLayoutManager.java | 115 +++++++++++------- 2 files changed, 89 insertions(+), 53 deletions(-) diff --git a/vlayout/src/main/java/com/alibaba/android/vlayout/RangeLayoutHelperFinder.java b/vlayout/src/main/java/com/alibaba/android/vlayout/RangeLayoutHelperFinder.java index cde8451e..3201b7f1 100644 --- a/vlayout/src/main/java/com/alibaba/android/vlayout/RangeLayoutHelperFinder.java +++ b/vlayout/src/main/java/com/alibaba/android/vlayout/RangeLayoutHelperFinder.java @@ -27,10 +27,13 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.ListIterator; /** * An implement of {@link LayoutHelperFinder} which finds layoutHelpers by position @@ -46,6 +49,8 @@ public class RangeLayoutHelperFinder extends LayoutHelperFinder { @NonNull private List mReverseLayoutHelpers =new LinkedList<>(); + private LayoutHelperItem[] mSortedLayoutHelpers = null; + @NonNull private Comparator mLayoutHelperItemComparator = new Comparator() { @Override @@ -68,16 +73,21 @@ public void setLayouts(@Nullable List layouts) { mReverseLayoutHelpers.clear(); mLayoutHelperItems.clear(); if (layouts != null) { - for (int i = 0, size = layouts.size(); i < size; i++) { - LayoutHelper helper = layouts.get(i); + ListIterator iterator = layouts.listIterator(); + LayoutHelper helper = null; + while (iterator.hasNext()) { + helper = iterator.next(); mLayoutHelpers.add(helper); mLayoutHelperItems.add(new LayoutHelperItem(helper)); } - for (int i = layouts.size() - 1; i >= 0; i--) { - mReverseLayoutHelpers.add(layouts.get(i)); + + while (iterator.hasPrevious()) { + mReverseLayoutHelpers.add(iterator.previous()); } - Collections.sort(mLayoutHelperItems, mLayoutHelperItemComparator); + // Collections.sort(mLayoutHelperItems, mLayoutHelperItemComparator); + mSortedLayoutHelpers = mLayoutHelperItems.toArray(new LayoutHelperItem[mLayoutHelperItems.size()]); + Arrays.sort(mSortedLayoutHelpers, mLayoutHelperItemComparator); } } @@ -90,18 +100,17 @@ protected List getLayoutHelpers() { @Nullable @Override public LayoutHelper getLayoutHelper(int position) { - final int count = mLayoutHelperItems.size(); - if (count == 0) { + if (mSortedLayoutHelpers == null || mSortedLayoutHelpers.length == 0) { return null; } + final int count = mSortedLayoutHelpers.length; int s = 0, e = count - 1, m; LayoutHelperItem rs = null; - // binary search range while (s <= e) { m = (s + e) / 2; - rs = mLayoutHelperItems.get(m); + rs = mSortedLayoutHelpers[m]; if (rs.getStartPosition() > position) { e = m - 1; } else if (rs.getEndPosition() < position) { diff --git a/vlayout/src/main/java/com/alibaba/android/vlayout/VirtualLayoutManager.java b/vlayout/src/main/java/com/alibaba/android/vlayout/VirtualLayoutManager.java index 13a9c96d..7653b3e7 100644 --- a/vlayout/src/main/java/com/alibaba/android/vlayout/VirtualLayoutManager.java +++ b/vlayout/src/main/java/com/alibaba/android/vlayout/VirtualLayoutManager.java @@ -47,12 +47,14 @@ import android.view.ViewGroup; import android.view.ViewParent; +import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.ListIterator; import java.util.Map; @@ -107,6 +109,20 @@ public static void enableDebugging(boolean isDebug) { private ViewLifeCycleHelper mViewLifeCycleHelper; + private Comparator, Integer>> mRangeComparator = new Comparator, Integer>>() { + @Override + public int compare(Pair, Integer> a, Pair, Integer> b) { + if (a == null && b == null) return 0; + if (a == null) return -1; + if (b == null) return 1; + + Range lr = a.first; + Range rr = b.first; + + return lr.getLower() - rr.getLower(); + } + }; + public VirtualLayoutManager(@NonNull final Context context) { this(context, VERTICAL); } @@ -175,9 +191,12 @@ public void setHelperFinder(@NonNull final LayoutHelperFinder finder) { List helpers = new LinkedList<>(); if (this.mHelperFinder != null) { List layoutHelpers = mHelperFinder.getLayoutHelpers(); - for (int i = 0, size = layoutHelpers.size(); i < size; i++) { - LayoutHelper helper = layoutHelpers.get(i); - helpers.add(helper); + Iterator iterator = layoutHelpers.iterator(); + LayoutHelper layoutHelper = null; + while (iterator.hasNext()) { + layoutHelper = iterator.next(); + helpers.add(layoutHelper); + } } @@ -211,17 +230,18 @@ public void setFixOffset(int left, int top, int right, int bottom) { */ public void setLayoutHelpers(@Nullable List helpers) { List layoutHelpers = mHelperFinder.getLayoutHelpers(); - for (int i = 0, size = layoutHelpers.size(); i < size; i++) { - LayoutHelper helper = layoutHelpers.get(i); + Iterator it0 = layoutHelpers.iterator(); + while (it0.hasNext()) { + LayoutHelper helper = it0.next(); oldHelpersSet.put(System.identityHashCode(helper), helper); } // set ranges if (helpers != null) { int start = 0; - for (int i = 0; i < helpers.size(); i++) { - LayoutHelper helper = helpers.get(i); - + Iterator it1 = helpers.iterator(); + while (it1.hasNext()) { + LayoutHelper helper = it1.next(); if (helper instanceof FixAreaLayoutHelper) { ((FixAreaLayoutHelper) helper).setAdjuster(mFixAreaAdjustor); } @@ -244,12 +264,12 @@ public void setLayoutHelpers(@Nullable List helpers) { this.mHelperFinder.setLayouts(helpers); layoutHelpers = mHelperFinder.getLayoutHelpers(); - for (int i = 0, size = layoutHelpers.size(); i < size; i++) { - LayoutHelper helper = layoutHelpers.get(i); - newHelpersSet.put(System.identityHashCode(helper), helper); + Iterator iterator = layoutHelpers.iterator(); + while (iterator.hasNext()) { + LayoutHelper layoutHelper = iterator.next(); + newHelpersSet.put(System.identityHashCode(layoutHelper), layoutHelper); } - for (Iterator> it = oldHelpersSet.entrySet().iterator(); it.hasNext(); ) { Map.Entry entry = it.next(); Integer key = entry.getKey(); @@ -364,8 +384,10 @@ public void onAnchorReady(RecyclerView.State state, ExposeLinearLayoutManagerEx. mTempAnchorInfoWrapper.position = anchorInfo.mPosition; mTempAnchorInfoWrapper.coordinate = anchorInfo.mCoordinate; List layoutHelpers = mHelperFinder.getLayoutHelpers(); - for (int i = 0, size = layoutHelpers.size(); i < size; i++) { - LayoutHelper layoutHelper = layoutHelpers.get(i); + Iterator iterator = layoutHelpers.iterator(); + LayoutHelper layoutHelper = null; + while (iterator.hasNext()) { + layoutHelper = iterator.next(); layoutHelper.onRefreshLayout(state, mTempAnchorInfoWrapper, this); } } @@ -434,8 +456,10 @@ private void runPreLayout(RecyclerView.Recycler recycler, RecyclerView.State sta if (mNested == 0) { List reverseLayoutHelpers = mHelperFinder.reverse(); - for (int i = 0, size = reverseLayoutHelpers.size(); i < size; i++) { - LayoutHelper layoutHelper = reverseLayoutHelpers.get(i); + Iterator iterator = reverseLayoutHelpers.iterator(); + LayoutHelper layoutHelper = null; + while (iterator.hasNext()) { + layoutHelper = iterator.next(); layoutHelper.beforeLayout(recycler, state, this); } } @@ -450,8 +474,10 @@ private void runPostLayout(RecyclerView.Recycler recycler, RecyclerView.State st final int startPosition = findFirstVisibleItemPosition(); final int endPosition = findLastVisibleItemPosition(); List layoutHelpers = mHelperFinder.getLayoutHelpers(); - for (int i = 0, size = layoutHelpers.size(); i < size; i++) { - LayoutHelper layoutHelper = layoutHelpers.get(i); + Iterator iterator = layoutHelpers.iterator(); + LayoutHelper layoutHelper = null; + while (iterator.hasNext()) { + layoutHelper = iterator.next(); try { layoutHelper.afterLayout(recycler, state, startPosition, endPosition, scrolled, this); } catch (Exception e) { @@ -608,8 +634,10 @@ public void onScrollStateChanged(int state) { int startPosition = findFirstVisibleItemPosition(); int endPosition = findLastVisibleItemPosition(); List layoutHelpers = mHelperFinder.getLayoutHelpers(); - for (int i = 0, size = layoutHelpers.size(); i < size; i++) { - LayoutHelper layoutHelper = layoutHelpers.get(i); + Iterator iterator = layoutHelpers.iterator(); + LayoutHelper layoutHelper = null; + while (iterator.hasNext()) { + layoutHelper = iterator.next(); layoutHelper.onScrollStateChanged(state, startPosition, endPosition, this); } } @@ -619,9 +647,12 @@ public void offsetChildrenHorizontal(int dx) { super.offsetChildrenHorizontal(dx); List layoutHelpers = mHelperFinder.getLayoutHelpers(); - for (int i = 0, size = layoutHelpers.size(); i < size; i++) { - LayoutHelper layoutHelper = layoutHelpers.get(i); + Iterator iterator = layoutHelpers.iterator(); + LayoutHelper layoutHelper = null; + while (iterator.hasNext()) { + layoutHelper = iterator.next(); layoutHelper.onOffsetChildrenHorizontal(dx, this); + } } @@ -629,8 +660,10 @@ public void offsetChildrenHorizontal(int dx) { public void offsetChildrenVertical(int dy) { super.offsetChildrenVertical(dy); List layoutHelpers = mHelperFinder.getLayoutHelpers(); - for (int i = 0, size = layoutHelpers.size(); i < size; i++) { - LayoutHelper layoutHelper = layoutHelpers.get(i); + Iterator iterator = layoutHelpers.iterator(); + LayoutHelper layoutHelper = null; + while (iterator.hasNext()) { + layoutHelper = iterator.next(); layoutHelper.onOffsetChildrenVertical(dy, this); } @@ -657,7 +690,7 @@ public int getVirtualLayoutDirection() { private LayoutStateWrapper mTempLayoutStateWrapper = new LayoutStateWrapper(); - private List, Integer>> mRangeLengths = new LinkedList<>(); + private List, Integer>> mRangeLengths = new ArrayList<>(); @Nullable private int findRangeLength(@NonNull final Range range) { @@ -732,19 +765,7 @@ protected void layoutChunk(RecyclerView.Recycler recycler, RecyclerView.State st } mRangeLengths.add(Pair.create(range, consumed)); - Collections.sort(mRangeLengths, new Comparator, Integer>>() { - @Override - public int compare(Pair, Integer> a, Pair, Integer> b) { - if (a == null && b == null) return 0; - if (a == null) return -1; - if (b == null) return 1; - - Range lr = a.first; - Range rr = b.first; - - return lr.getLower() - rr.getLower(); - } - }); + Collections.sort(mRangeLengths, mRangeComparator); } } @@ -852,8 +873,10 @@ public void onItemsMoved(RecyclerView recyclerView, int from, int to, int itemCo @Override public void onItemsChanged(RecyclerView recyclerView) { List layoutHelpers = mHelperFinder.getLayoutHelpers(); - for (int i = 0, size = layoutHelpers.size(); i < size; i++) { - LayoutHelper layoutHelper = layoutHelpers.get(i); + Iterator iterator = layoutHelpers.iterator(); + LayoutHelper layoutHelper = null; + while (iterator.hasNext()) { + layoutHelper = iterator.next(); layoutHelper.onItemsChanged(this); } @@ -907,8 +930,10 @@ public void onDetachedFromWindow(RecyclerView view, RecyclerView.Recycler recycl super.onDetachedFromWindow(view, recycler); List layoutHelpers = mHelperFinder.getLayoutHelpers(); - for (int i = 0, size = layoutHelpers.size(); i < size; i++) { - LayoutHelper layoutHelper = layoutHelpers.get(i); + Iterator iterator = layoutHelpers.iterator(); + LayoutHelper layoutHelper = null; + while (iterator.hasNext()) { + layoutHelper = iterator.next(); layoutHelper.clear(this); } @@ -1141,8 +1166,10 @@ public List getFixedViews() { // TODO: support zIndex? List views = new LinkedList<>(); List layoutHelpers = mHelperFinder.getLayoutHelpers(); - for (int i = 0, size = layoutHelpers.size(); i < size; i++) { - LayoutHelper layoutHelper = layoutHelpers.get(i); + Iterator iterator = layoutHelpers.iterator(); + LayoutHelper layoutHelper = null; + while (iterator.hasNext()) { + layoutHelper = iterator.next(); View fixedView = layoutHelper.getFixedView(); if (fixedView != null) { views.add(fixedView);