From a7c73724c56619fdda7d42276743c2712c9bd483 Mon Sep 17 00:00:00 2001 From: yarolegovich Date: Sat, 1 Aug 2020 17:35:22 +0300 Subject: [PATCH] Fixed onItemChanged not being called after scrollToPosition re #147 --- .../DiscreteScrollView.java | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/library/src/main/java/com/yarolegovich/discretescrollview/DiscreteScrollView.java b/library/src/main/java/com/yarolegovich/discretescrollview/DiscreteScrollView.java index 759c8d3..560e5d0 100644 --- a/library/src/main/java/com/yarolegovich/discretescrollview/DiscreteScrollView.java +++ b/library/src/main/java/com/yarolegovich/discretescrollview/DiscreteScrollView.java @@ -30,6 +30,12 @@ public class DiscreteScrollView extends RecyclerView { private List scrollStateChangeListeners; private List onItemChangedListeners; + private Runnable notifyItemChangedRunnable = new Runnable() { + @Override + public void run() { + notifyCurrentItemChanged(); + } + }; private boolean isOverScrollEnabled; @@ -97,6 +103,15 @@ public ViewHolder getViewHolder(int position) { return view != null ? getChildViewHolder(view) : null; } + @Override + public void scrollToPosition(int position) { + int currentPosition = layoutManager.getCurrentPosition(); + super.scrollToPosition(position); + if (currentPosition != position) { + notifyCurrentItemChanged(); + } + } + /** * @return adapter position of the current item or -1 if nothing is selected */ @@ -197,12 +212,17 @@ private void notifyCurrentItemChanged(ViewHolder holder, int current) { } private void notifyCurrentItemChanged() { + removeCallbacks(notifyItemChangedRunnable); if (onItemChangedListeners.isEmpty()) { return; } int current = layoutManager.getCurrentPosition(); ViewHolder currentHolder = getViewHolder(current); - notifyCurrentItemChanged(currentHolder, current); + if (currentHolder == null) { + post(notifyItemChangedRunnable); + } else { + notifyCurrentItemChanged(currentHolder, current); + } } private class ScrollStateListener implements DiscreteScrollLayoutManager.ScrollStateListener { @@ -216,6 +236,7 @@ public void onIsBoundReachedFlagChange(boolean isBoundReached) { @Override public void onScrollStart() { + removeCallbacks(notifyItemChangedRunnable); if (scrollStateChangeListeners.isEmpty()) { return; } @@ -256,12 +277,7 @@ public void onScroll(float currentViewPosition) { @Override public void onCurrentViewFirstLayout() { - post(new Runnable() { - @Override - public void run() { - notifyCurrentItemChanged(); - } - }); + notifyCurrentItemChanged(); } @Override