Android Kotlin에서 무한 스크롤 구현
오늘은 최종 프로젝트 작업도중 무한 스크롤 구현을 배웠습니다. 이는 사용자가 목록 끝으로 스크롤할 때 새 데이터를 가져와 표시하여 원활하고 중단 없는 사용자 경험을 보장하는 모바일 앱에서 널리 사용되는 기능입니다.
마지막에는 마지막 페이지 입니다.
라는 문구를 남겼습니다.
매서드를 구현 RecyclerView.OnScrollListener()
하고 재정의 합니다. onScrollStateChanged
private val scrollListener by lazy {
object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if (newState == RecyclerView.SCROLL_STATE_IDLE
&& !binding.tourRecyclerview.canScrollVertically(1)
) {
// Load more data here
}
}
}
}
위 리스너는 RecyclerView가 더 이상 수직으로 스크롤할 수 없는지 , 즉 끝에 도달했는지 확인합니다.
목록 끝에 도달하고 가져올 데이터가 더 있으면 (!isLastPage
)다음 페이지의 데이터를 가져옵니다.
if (isLastPage) {
toast("마지막 페이지 입니다.")
return
}
when (tourTheme) {
TourTheme.POPULAR.themeId -> getFestivalSearch(++currentPage)
else -> getThemeSearch(theme, ++currentPage)
}
변수 currentPage
는 다음에 가져올 페이지를 추적합니다.
스크롤 리스너를 정의한 후 RecyclerView에 추가됩니다.
binding.tourRecyclerview.addOnScrollListener(scrollListener)
새 데이터를 가져오면 submitList()
메서드 를 사용하여 이 데이터로 어댑터를 업데이트 합니다. `submitList()
tourAdapter.submitList(festivals)
새 데이터 가져오기를 언제 중지할지 결정하는 것이 중요합니다. 이를 추적하는 데 부울 isLastPage
이 사용됩니다. 가져온 데이터 크기가 예상 크기보다 작으면 더 이상 가져올 데이터가 없다는 의미입니다.
if (festivals.size < 20) {
isLastPage = true
}