마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

paging3에서 받아오는 데이터가 없을때 loading 그만하는법

0 추천
안녕하세요 paging3으로 게시물 받아오는거 구현하고 있습니다. 만약 게시물이 없을때 Loading을 멈추고싶은데 서버랑 통신을 게속 하더라고요 (okHTTP에 로그 찍힙니다.) 어떻게 하면 될까요?
hifl (230 포인트) 님이 9월 4일 질문
hifl님이 9월 5일 수정

1개의 답변

0 추천
 
채택된 답변

그건 아마도 PagingSource 에 page number 처리를 처리를 제대로 하지 않고 있기 때문일 것 같습니다. 이게 원인이라면, 이건 refresh 기능에도 영향을 미칠 겁니다. 

 

class MoviePagingSource(
    val movieApiService: MovieApiService,
) : PagingSource<Int, DataType>() {
  
  override suspend fun load(params: LoadParams<Int>): LoadResult<Int, DataType> {
    try {
      // Start refresh at page 1 if undefined.
      val nextPage = params.key ?: 1
      val response = ...

      
      return LoadResult.Page(
        data = response.movies,
        prevKey = if (nextPage == 1) null else nextPage - 1,
        nextKey = if (noMoreData) null else response.page + 1
      )
    } catch (e: Exception) {
        return LoadResult.Error(e)
    }
  }
}

 

위의 예제 코드에서 마지막에 LoadResult.Page 부분 처리가 중요합니다. 만약 nextKey를 제대로 처리하지 않으면 님이 말씀하신 것과 같은 증상이 일어납니다. 더이상 처리할 데이터가 없다면 null을 리턴하시면 됩니다.

spark (72,310 포인트) 님이 9월 5일 답변
hifl님이 9월 6일 채택됨
보니까 서버의 count값이 0만 뜨네요 .. 문제가 있는것 같아요
서버 API가 현재 페이지 번호를 리턴 못하네요..
그럼 서버쪽 API부터 고쳐나가면 되겠네요. 혹 서버 API가 업데이트 되기 전에 테스트 해보시려면 WireMock 같은 프로그램을 로컬로 돌리시고 가짜 응답 파일 제공해주면 가능합니다. 아니면 Burp나 Charlse 같은 proxy 툴로 응답을 바꿔치기 할 수도 있구요.
val page = params.key ?: 1 여기서 page가 1더해졌을 때 state가 Loading이 되는건가요?
LoadingState 의 변경은 PagingAapdter에서 refresh, retry또는 adapter의 마지막부분에서 scroll up을 할 때 변경될 겁니다.  params.key는 다음 페이지를 로딩하기 위해서 필요한 값입니다. 로딩할 페이지가 존재한다면 로딩상태로 바뀌겠죠.
...