기능
RecyclerView
어댑터가 자동으로 데이터를 요청합니다.LiveData
및 RxJava를 최고 수준으로 지원합니다.
Repository Layer
📍Paging Data - 페이징된 데이터의 Container
역할. 데이터가 새로고침될 때마다 이에 상응하는 PagingData가 별도로 생성된다.
📍Paging Source - 데이터 소스를 정의하고 데이터를 가져오는 방법을 정의
📍RemoteMediator - 네트워크(Remote)에서 불러온 데이터를 로컬 데이터베이스에 캐시(Cache)하여 불러오는 것을 담당한다. 오프라인 상태에서도 캐시된 데이터를 불러옴으로 유저 경험을 향상시켜줄 수 있다.
ViewModel Layer
📍Pager - Repository Layer에서 구현된 PagingSource과 함께 PagingData 인스턴스를 구성하는 반응형 스트림을 생성한다. PagingSource에서 데이터를 로드하는 방법, 옵션을 정의한 PagingConfig 클래스와 함께 사용된다.
UI Layer
📍PagingDataAdapter - PagingData를 RecyclerView에 바인딩하기 위해 사용
사용 OpenApi - 코로나 19 예방접종센터 조회 서비스
데이터 소스를 정의하고 이 소스에서 데이터를 가져오는 방법을 정의한다.
load(params: LoadParams)
load 함수는 사용자가 스크롤 할 때마다 데이터를 비동기적으로 가져온다.
params.key에 현재 페이지 인덱스를 관리하고, 처음 데이터를 로드할 때에는 null이 반환된다.
params.loadSize는 가져올 데이터의 갯수를 관리
LoadResult.Page
를 반환하고 실패하면 LoadResult.Error
객체를 반환한다.getRefreshKey()
스와이프 Refresh나 데이터 업데이트 등 현재 목록을 대체할 새 데이터를 로드할 때 사용
가장 최근에 접근한 인덱스인 anchorPosition
으로 주변 데이터를 다시 로드
Repository에서 Pager와 PagerSource를 사용하여 PagingData로 반환 ( 이때 여기서는 Flow 형태로 반환)
PagingSource
구현에서 페이징된 데이터의 스트림이 필요
pagingSourceFactory
Repository에서 PagingData를 가져오고 cachedIn(viewModelScope)
를 사용하여 캐싱을 해줄 수 있다.
DiffUtil
를 사용한다. (기존 RecyclerView.Adapter와 매우 비슷하다.)submitData()
는 suspend 함수이기 때문에 코루틴을 사용하여 호출한다.🔦주의🔦
코루틴을 사용하여 호출하기 때문에 fun 앞에 suspend를 붙여야 한다!!
(supsend를 붙이지 않으면 LoadResult.Error를 반환한다)
🐥결과물🐥