From cac952bbae10f82a5665ed0f6e2c80e07e0db1c5 Mon Sep 17 00:00:00 2001 From: Floens Date: Fri, 14 Aug 2015 15:51:45 +0200 Subject: [PATCH] Fix scroll position one-off because of the last seen indicator --- .../chan/core/presenter/ThreadPresenter.java | 6 +++--- .../org/floens/chan/ui/adapter/PostAdapter.java | 10 +++++++++- .../org/floens/chan/ui/layout/ThreadLayout.java | 4 ++-- .../floens/chan/ui/layout/ThreadListLayout.java | 14 ++++++++------ 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java index 890b74aa..e50baeb5 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java @@ -285,8 +285,8 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt showPosts(); } - public void scrollTo(int position, boolean smooth) { - threadPresenterCallback.scrollTo(position, smooth); + public void scrollTo(int displayPosition, boolean smooth) { + threadPresenterCallback.scrollTo(displayPosition, smooth); } public void scrollToImage(PostImage postImage, boolean smooth) { @@ -652,7 +652,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt void showImages(List images, int index, Loadable loadable, ThumbnailView thumbnail); - void scrollTo(int position, boolean smooth); + void scrollTo(int displayPosition, boolean smooth); void highlightPost(Post post); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java index df0b1c11..12f98a8d 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java @@ -264,7 +264,7 @@ public class PostAdapter extends RecyclerView.Adapter { this.postViewMode = postViewMode; } - private int getPostPosition(int position) { + public int getPostPosition(int position) { int postPosition = position; if (lastSeenIndicatorPosition >= 0 && position > lastSeenIndicatorPosition) { postPosition--; @@ -272,6 +272,14 @@ public class PostAdapter extends RecyclerView.Adapter { return postPosition; } + public int getScrollPosition(int displayPosition) { + int postPosition = displayPosition; + if (lastSeenIndicatorPosition >= 0 && displayPosition > lastSeenIndicatorPosition) { + postPosition++; + } + return postPosition; + } + private boolean showStatusView() { return postAdapterCallback.getLoadable().isThreadMode(); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java index a6a6bef2..ca28a1a1 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java @@ -309,8 +309,8 @@ public class ThreadLayout extends CoordinatorLayout implements ThreadPresenter.T } @Override - public void scrollTo(int position, boolean smooth) { - threadListLayout.scrollTo(position, smooth); + public void scrollTo(int displayPosition, boolean smooth) { + threadListLayout.scrollTo(displayPosition, smooth); } @Override diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java index c89ba674..66708f3a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java @@ -366,20 +366,22 @@ public class ThreadListLayout extends LinearLayout implements ReplyLayout.ReplyL return thumbnail; } - public void scrollTo(int position, boolean smooth) { - if (position < 0) { - position = recyclerView.getAdapter().getItemCount() - 1; + public void scrollTo(int displayPosition, boolean smooth) { + if (displayPosition < 0) { + displayPosition = recyclerView.getAdapter().getItemCount() - 1; } - int difference = Math.abs(position - getTopAdapterPosition()); + int scrollPosition = postAdapter.getScrollPosition(displayPosition); + + int difference = Math.abs(scrollPosition - getTopAdapterPosition()); if (difference > MAX_SMOOTH_SCROLL_DISTANCE) { smooth = false; } if (smooth) { - recyclerView.smoothScrollToPosition(position); + recyclerView.smoothScrollToPosition(scrollPosition); } else { - recyclerView.scrollToPosition(position); + recyclerView.scrollToPosition(scrollPosition); } }