지난 프로젝트에서 ViewPager 로 메뉴들을 보여주는데, 순환하게끔 구현해달라는 요청이 있었다.
열심히 구글링해보니 Circular ViewPager 라고 하는듯!
기본적인 viewPager 는 구현했다는 가정 하에 글을 작성해보려한다 🥳
stackoverflow 를 참고했다!
private var currentPosition: Int = 0
private var scrollState: Int = 0
currentPosition
, scroll 상태를 저장하는 scrollState
두 개의 변수를 선언한다. private val pageChangeCallback = object : ViewPager2.OnPageChangeCallback() {
override fun onPageScrollStateChanged(state: Int) {
super.onPageScrollStateChanged(state)
handleScrollState(state)
scrollState = state
}
private fun handleScrollState(state: Int) {
if (state == ViewPager2.SCROLL_STATE_IDLE && scrollState == ViewPager2.SCROLL_STATE_DRAGGING) {
setNextItemIfNeeded()
}
}
private fun setNextItemIfNeeded() {
// settle 이 아니라면 다음 화면 넘어가기
if (!isScrollStateSettling()) {
handleSetNextItem()
}
}
private fun isScrollStateSettling(): Boolean {
return scrollState == ViewPager2.SCROLL_STATE_SETTLING
}
private fun handleSetNextItem() {
val lastPosition = binding.viewPager.adapter?.itemCount?.minus(1)
// 첫번째 화면이면 마지막 화면으로
if (currentPosition == 0) {
if (lastPosition != null) {
binding.viewPager.setCurrentItem(lastPosition, false)
}
// 마지막 화면이면 첫번째 화면으로
} else if (currentPosition == lastPosition) {
binding.viewPager.setCurrentItem(0, false)
}
}
onPageScrollStateChanged()
이다.handleScrollState()
호출 후, scrollState 가 업데이트되니까 state 가 IDLE 이면 scrollState 는 DRAGGING 이 된다. override fun onPageSelected(position: Int) {
super.onPageSelected(position)
currentPosition = position
}
onPageSelected()
에서는 currentPosition 을 업데이트 해준다.결과는 이렇다.
벗... 순환할때 끊기는 문제가 발생하는데 이건 또 해결해봐야겠다...