I am using Viewpager2 and calling setCurrentItem(index, false) but Viewpager2 still smooth scroll. I am using with this library SegmentedProgressBar.
When commenting out the code for the library, viewpager doesn’t smooth scroll.
Here are the codes
private fun initViewPager() {
mBinding.viewpager.apply {
isUserInputEnabled = false
adapter = mAdapter
setCurrentItem(1, false)
registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageScrollStateChanged(state: Int) {
if (state == ViewPager2.SCROLL_STATE_IDLE) {
if (currentItem == mAdapter.itemCount - 1) {
AppUtils.setTimeout({
setCurrentItem(1, false)
}, 1000)
}
}
}
override fun onPageSelected(position: Int) {
if (mIsInitialized && position != mAdapter.itemCount - 1) {
mAdapter.play(position)
}
}
})
setOnTouchListener { _, event ->
if (event.action == MotionEvent.ACTION_UP && mIsOnHold) {
mBinding.segmentProgress.start()
mAdapter.resume(currentItem)
mIsOnHold = false
}
return@setOnTouchListener if (mGestureDetector.onTouchEvent(event)) {
true
} else {
super.onTouchEvent(event)
}
}
post {
mViewPagerWidth = width
}
}
initSegmentProgress()
}
private fun initSegmentProgress() {
mBinding.segmentProgress.apply {
segmentCount = 4
timePerSegmentMs = 5000L
listener = object : SegmentedProgressBarListener {
override fun onPage(oldPageIndex: Int, newPageIndex: Int) {
if (!mIsInitialized || oldPageIndex == -1) return
mBinding.viewpager.setCurrentItem(newPageIndex + 1, false)
}
override fun onFinished() {
mBinding.viewpager.currentItem += 1
restartSegment()
}
}
setPosition(0)
start()
mIsInitialized = true
}
}
private fun initGestureDetector() {
mGestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapUp(e: MotionEvent): Boolean {
if (e.x < mViewPagerWidth / 2) {
if (mBinding.viewpager.currentItem == 1) {
mBinding.segmentProgress.restartCurrentSegment()
mAdapter.restart()
} else {
mBinding.segmentProgress.previous()
}
} else {
if (mBinding.viewpager.currentItem < mAdapter.itemCount - 1) {
mBinding.segmentProgress.next()
} else {
mBinding.segmentProgress.restartSegment()
}
}
return true
}
override fun onShowPress(e: MotionEvent) {
mIsOnHold = true
mBinding.segmentProgress.pause()
mAdapter.pause(mBinding.viewpager.currentItem)
}
override fun onDown(e: MotionEvent): Boolean {
return true
}
})
}
This is for infinite viewpager. The logic is working but the issue is with smooth scroll. I want to set current item without smooth scroll but it didn’t work.
mamatesting tester is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.