diff --git a/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/CardStackLayoutManager.java b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/CardStackLayoutManager.java index c443cb04..cc8280a6 100644 --- a/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/CardStackLayoutManager.java +++ b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/CardStackLayoutManager.java @@ -48,7 +48,10 @@ public RecyclerView.LayoutParams generateDefaultLayoutParams() { public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State s) { update(recycler); if (s.didStructureChange()) { - listener.onCardAppeared(getTopView(), state.topPosition); + View topView = getTopView(); + if (topView != null) { + listener.onCardAppeared(getTopView(), state.topPosition); + } } } diff --git a/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/internal/CardStackDataObserver.java b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/internal/CardStackDataObserver.java index 549b57f8..a55f320e 100644 --- a/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/internal/CardStackDataObserver.java +++ b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/internal/CardStackDataObserver.java @@ -36,11 +36,18 @@ public void onItemRangeInserted(int positionStart, int itemCount) { @Override public void onItemRangeRemoved(int positionStart, int itemCount) { + // 要素が削除された場合はTopPositionの調整が必要になる場合がある + // 具体的には、要素が全て削除された場合と、TopPositionより前の要素が削除された場合は調整が必要 CardStackLayoutManager manager = getCardStackLayoutManager(); - if (positionStart == 0) { + int topPosition = manager.getTopPosition(); + if (manager.getItemCount() == 0) { + // 要素が全て削除された場合 manager.setTopPosition(0); + } else if (positionStart < topPosition) { + // TopPositionよりも前の要素が削除された場合 + int diff = topPosition - positionStart; + manager.setTopPosition(Math.min(topPosition - diff, manager.getItemCount() - 1)); } - manager.removeAllViews(); } @Override