From 48bdbade55c3b7d3a9b6a5d64334198b177cd039 Mon Sep 17 00:00:00 2001 From: Yuya Kaido Date: Fri, 7 Jun 2019 22:19:24 +0900 Subject: [PATCH] Avoid removing views when rewinding --- .../internal/CardStackSmoothScroller.java | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/internal/CardStackSmoothScroller.java b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/internal/CardStackSmoothScroller.java index 54eba6e8..f60aa24f 100644 --- a/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/internal/CardStackSmoothScroller.java +++ b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/internal/CardStackSmoothScroller.java @@ -2,13 +2,13 @@ import android.view.View; -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - import com.yuyakaido.android.cardstackview.CardStackLayoutManager; import com.yuyakaido.android.cardstackview.CardStackListener; import com.yuyakaido.android.cardstackview.RewindAnimationSetting; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + public class CardStackSmoothScroller extends RecyclerView.SmoothScroller { public enum ScrollType { @@ -37,22 +37,6 @@ protected void onSeekTargetStep( @NonNull Action action ) { if (type == ScrollType.AutomaticRewind) { - // ■ 概要 - // ここでViewのRemoveを行わないとRewindが無限ループに陥ってしまう - // ■ 再現手順 - // 1. `manager.removeAllViews();`をコメントアウト - // 2. AutomaticSwipeを1度実行する - // 3. AutomaticRewindを1度実行する - // 4. AutomaticSwipeを1度実行する - // 5. AutomaticRewindを1度実行する -> これが無限ループに陥ってしまう - // ■ 調査結果 - // SmoothScroller.onStartが呼ばれたタイミングでは、Rewind対象のViewが見つからない(正常挙動) - // Rewind処理開始後のupdateで対象のViewが追加されるはずだが、現状の実装では正常に追加されない - // 結果として、Rewind対象のViewが永遠に見つからずに無限ループに陥ってしまう - // ■ 副作用 - // ViewのRemoveを行っているため、表示対象となっているViewの再生成が実行されてしまう - // これによってパフォーマンス上の問題が発生する可能性がある - manager.removeAllViews(); RewindAnimationSetting setting = manager.getCardStackSetting().rewindAnimationSetting; action.update( -getDx(setting),