diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java index af7f2a3b1..ef814c73d 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java @@ -1143,6 +1143,11 @@ public class FavoritesScene extends BaseScene implements } } + @Override + protected boolean isDuplicate(GalleryInfo d1, GalleryInfo d2) { + return d1.gid == d2.gid; + } + @Override protected void onScrollToPosition(int postion) { if (0 == postion) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java index 0425cd79c..d8504edc5 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java @@ -1425,6 +1425,11 @@ public final class GalleryListScene extends BaseScene showActionFab(); } + @Override + protected boolean isDuplicate(GalleryInfo d1, GalleryInfo d2) { + return d1.gid == d2.gid; + } + @Override protected void onScrollToPosition(int postion) { if (0 == postion) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java index 85cd7763e..dcccc3070 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java @@ -330,6 +330,11 @@ public class GalleryPreviewsScene extends ToolbarScene implements EasyRecyclerVi mAdapter.notifyItemRangeInserted(positionStart, itemCount); } } + + @Override + protected boolean isDuplicate(GalleryPreview d1, GalleryPreview d2) { + return false; + } } private void onGetPreviewSetSuccess(Pair result, int taskId) { diff --git a/app/src/main/java/com/hippo/widget/ContentLayout.java b/app/src/main/java/com/hippo/widget/ContentLayout.java index 8f085a14b..3197c398e 100644 --- a/app/src/main/java/com/hippo/widget/ContentLayout.java +++ b/app/src/main/java/com/hippo/widget/ContentLayout.java @@ -46,6 +46,7 @@ import com.hippo.yorozuya.IntIdGenerator; import com.hippo.yorozuya.LayoutUtils; import com.hippo.yorozuya.collect.IntList; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; public class ContentLayout extends FrameLayout { @@ -167,6 +168,8 @@ public class ContentLayout extends FrameLayout { private static final String TAG = ContentHelper.class.getSimpleName(); + private static final int CHECK_DUPLICATE_RANGE = 50; + private static final String KEY_SUPER = "super"; private static final String KEY_SHOWN_VIEW = "shown_view"; private static final String KEY_TIP = "tip"; @@ -423,6 +426,22 @@ public class ContentLayout extends FrameLayout { notifyItemRangeRemoved(index, 1); } + protected abstract boolean isDuplicate(E d1, E d2); + + private void removeDuplicateData(List data, int start, int end) { + start = Math.max(0, start); + end = Math.min(mData.size(), end); + for (Iterator iterator = data.iterator(); iterator.hasNext();) { + E d = iterator.next(); + for (int i = start; i < end; i++) { + if (isDuplicate(d, mData.get(i))) { + iterator.remove(); + break; + } + } + } + } + public void onGetPageData(int taskId, List data) { if (mCurrentTaskId == taskId) { int dataSize; @@ -475,6 +494,7 @@ public class ContentLayout extends FrameLayout { break; case TYPE_PRE_PAGE: case TYPE_PRE_PAGE_KEEP_POS: + removeDuplicateData(data, 0, CHECK_DUPLICATE_RANGE); dataSize = data.size(); for (int i = 0, n = mPageDivider.size(); i < n; i++) { mPageDivider.set(i, mPageDivider.get(i) + dataSize); @@ -537,6 +557,7 @@ public class ContentLayout extends FrameLayout { break; case TYPE_NEXT_PAGE: case TYPE_NEXT_PAGE_KEEP_POS: + removeDuplicateData(data, mData.size() - CHECK_DUPLICATE_RANGE, mData.size()); dataSize = data.size(); int oldDataSize = mData.size(); mPageDivider.add(oldDataSize + dataSize); @@ -647,6 +668,7 @@ public class ContentLayout extends FrameLayout { int oldIndexStart = mCurrentTaskPage == mStartPage ? 0 : mPageDivider.get(mCurrentTaskPage - mStartPage - 1); int oldIndexEnd = mPageDivider.get(mCurrentTaskPage - mStartPage); mData.subList(oldIndexStart, oldIndexEnd).clear(); + removeDuplicateData(data, oldIndexStart - CHECK_DUPLICATE_RANGE, oldIndexStart + CHECK_DUPLICATE_RANGE); int newIndexStart = oldIndexStart; int newIndexEnd = newIndexStart + data.size(); mData.addAll(oldIndexStart, data);