From 4c30813b7eda7291e37b1108b7bf0f4199e2e67d Mon Sep 17 00:00:00 2001 From: Pavel Tsekov Date: Mon, 8 Mar 2021 13:08:20 +0200 Subject: [PATCH] Fix arrow scroll --- .../loopingviewpager/widget/LoopingViewPager.kt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/loopingviewpager/src/main/java/com/kenilt/loopingviewpager/widget/LoopingViewPager.kt b/loopingviewpager/src/main/java/com/kenilt/loopingviewpager/widget/LoopingViewPager.kt index 13bba31..7093ea4 100644 --- a/loopingviewpager/src/main/java/com/kenilt/loopingviewpager/widget/LoopingViewPager.kt +++ b/loopingviewpager/src/main/java/com/kenilt/loopingviewpager/widget/LoopingViewPager.kt @@ -19,6 +19,7 @@ class LoopingViewPager : ViewPager { private var originalAdapter: PagerAdapter? = null private var internalAdapter: PagerAdapter? = null private val pageChangeListenerMap = HashMap() + private var insideArrowScroll: Boolean = false constructor(context: Context) : super(context) @@ -100,11 +101,16 @@ class LoopingViewPager : ViewPager { } override fun setCurrentItem(item: Int, smoothScroll: Boolean) { + // setCurrentItem() assumes it is passed an item position from the + // original adapter, however when it is invoked from within arrowScroll() + // it is passed an item position from the internal adapter, so the code + // should account for it. + val originalItem = if (insideArrowScroll) getPagerPosition(originalAdapter, item) else item val count = adapter?.count ?: 0 - if (item == 0 && currentItem == count - 1) { + if (originalItem == 0 && currentItem == count - 1) { super.setCurrentItem(count + 2, smoothScroll) } else { - super.setCurrentItem(getInternalPosition(originalAdapter, item), smoothScroll) + super.setCurrentItem(getInternalPosition(originalAdapter, originalItem), smoothScroll) } } @@ -123,6 +129,13 @@ class LoopingViewPager : ViewPager { } } + override fun arrowScroll(direction: Int): Boolean { + insideArrowScroll = true + val handled = super.arrowScroll(direction) + insideArrowScroll = false + return handled + } + private fun handleSetCurrentItem(position: Int) { val itemCount = internalAdapter?.count ?: 0 if (itemCount <= 1) return