개요
안드로이드에서 페이징 처리를 하기 위해선 AAC의 Paging 라이브러리를 활용하여 처리한다. 과거에는 이런 라이브러리가 존재하지 않았는데 이런게 없었다면 어떻게 처리해야 할까?
요약
리사이클러뷰에 ScrollListener를 부착하여 스크롤을 감지하고 스크롤이 끝에 도착하여 더 이상 움직일 수 없는지 확인하고 싶다면 canScrollVertically 메서드를 사용하면 된다. 추가로 더 정확성을 높히기 위해서 RecyclerView에 부착된 레이아웃 매니저에서 findLastCompletlyVisibleItemPosition() 메서드를 활용하여 마지막에 보이고 있는 아이템의 포지션을 갖고 온 뒤, 지금까지 노출 된 총 아이템 수와 같은지 비교하면 더 정확하다.
구현 예시
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val lastVisibleItemPosition =(recyclerView.layoutManager as LinearLayoutManager)
.findLastCompletelyVisibleItemPosition()
val totalCount = recyclerView.adapter!!.itemCount-1
if (!recyclerView.canScrollVertically(1) && lastVisibleItemPosition==totalCount-1) {
//스크롤이 끝에 도달할 경우[canScrollVertically(최하단:1 or 최상단:-1)]
//&& 마지막 아이템일 경우(lastVisibleItemPosition==totalCount-)
}
}
})
UX를 향상시키려면 네트워킹 과정에서 ProgressBar를 보여주면 더 좋을 것 같다. 실제 데이터를 가져오는 작업은 마지막 아이템 offset을 저장한 뒤, RxJava를 활용하여 현재 offset에 해당하는 청크를 요청하고 요청 시작 시점에 ProgressBar를 호출하고 작업 완료 시 ProgressBar를 안 보이게 처리하면 될 것 같다.
'안드로이드' 카테고리의 다른 글
[안드로이드] ListAdapter의 작동 원리 및 갱신이 안되는 경우 (2) | 2021.07.02 |
---|---|
[Android] SingleLiveEvent + 기타: setValue() vs postValue() (0) | 2021.06.26 |
[Android] Dagger 관련 스택 오버 플로우 질의 번역 - subcomponent with contibutor (0) | 2021.05.05 |
[Android] Dagger2 주요 개념 총 정리 (0) | 2021.05.01 |
[Android] ContributesAndroidInjector란? (0) | 2021.05.01 |