땀이 삐질삐질 나는 개발 일기

[Recyclerview Paing] 기본 리사이클러뷰 페이징 처리 Feat.Rx 본문

개발 Tip

[Recyclerview Paing] 기본 리사이클러뷰 페이징 처리 Feat.Rx

삐질 2021. 4. 7. 22:09

안녕하세요. 삐질삐질 개발하는 개발자 삐질입니다

 

굉장히 오랜만에 포스팅 하는 것 같습니다.

 

바로 본론으로 들어가서, 오늘 소개해드릴 Tip은 우리가 흔히 쓰는 리사이클러뷰를 통해 

 

Remote(server) API를 요청후 결과값을 리스트에 뿌려주는 과정에서, 너무 많은 데이터를 한번에 불러올 수 없기 때문에 

   - 너무 많이 불러오면 서버 과부하..

 

페이징 처리가 된 API와, 그에 맞게 호출하여 결과를 리스트에 추가해주는 방법을 알아보겠습니다.

 

 

사실 다른 부분은 크게 중요치 않습니다. 아래 코드가 전부라고 봐도 무방할 정도입니다.

하지만 이렇게 가벼운 설명으로 끝내면 너무 정이 없죠? 

 

기본적인 흐름은 아래와 같습니다.

 

1. Page의 속성을 담당할 entity클래스가 있습니다. 이 클래스는 요청할 페이지와, 한번에 요청할 아이템의 갯수를 저장하는 클래스입니다.

 

위 클래스는 각 프로퍼티를 보관하고 있고, plusPage라는 page value를 1씩 증가시키는 펑션을 담고 있습니다.

 

2. 페이징 API의 기본적으로 요구하는 params는  위와 같이 page, size가 있습니다.

 

3. 해당 value들로 하여금 API를 request하여 List를 받고, adapter item에 add를 해주게 됩니다.

 

4. 그러면 한 페이지 분의 list가 리사이클러뷰에 셋 되겠지요?

 

여기부터가 페이징의 시작

 

5. 페이징을 하기 위해서는 , 언제? 다음 페이지를 호출 할 것인가를 알아야하고, 저는 scrollListener를 이용해, 가장 아래에 스크롤이 도달했는지 여부를 검사했습니다. 

 

6. 이렇게 canScrolLVertically(-1) 펑션의 리턴이 true일 때, 최하단에 스크롤이 갔다는 사실을 알고, 다음 동작을 호출하게 됩니다.

 

7. 이때 scrollObserver는 더 아래에서 설명하도록 하겠습니다.

 

8. 다음 페이지를 호출하는 내용은 아래와 같습니다.

9. pageEntity의 plusPage를 호출함으로써 pageEntity가 가진 page의 속성을 +1 시켜준 뒤,

 

10. 다음 API를 호출합니다. 그후 받은 결과값을 다시 adatper item에 addAll시켜주고 notify를 해주면 끝이나게 됩니다.

 

 

 

-----------------------------------------

여기에 사용된 scrollObserver라는 것은, 이 scrollListener는 바닥에 닿을때 마다 해당 리스너가 불리우기 때문에 한 번에 여러개의 Api가 호출되는 불상사가 있을 수 있습니다. 이때 중복이 되는 부분을 걸러주기 위한 observer인데 ,

 

이때 사용한 기법으로는 Rx쪽의 throttleFirst라는 첫번째 신호가 들어온 뒤 , 지정된 시간동안 들어오는 처음 신호 이후의 신호를 싹 무시해버리는 기법입니다.

 

이것에 대해서는 Rxjava,RxKotlin의 throttle이라는 부분에 대해 공부하시면 좋습니다.

(사실 이 부분 없어도....크게 상관은 없습니다 만, 디테일하게 정확하게 처리하고 싶은 분은 추천 드립니다.)

단지 이 장에서는 기법만을 소개하기 때문에 최선의 방법 보다는, 기본적인 개념을 위한 설명으로 이해해주시면 감사하겠습니다.

 

rx를 사용하지 않고, 난 그냥 어찌됐던 최 하단이면 api를 호출하고 싶다 라고 하신 다면, scrollObserver.onNext(true)를 호출하는 대신,

바로 그 자리에서 pluspage()와 다음 API를 호출하여 작업하시면 됩니다.

 

또한, PageAdapter , ListAdapter를 활용한 방법들도 있지만, 굳이~나는 이런것들말고 기본 Reyclerview로 만들고 싶다 하시는 분께 추천드립니다. 차후 위의 어댑터들로 구성하는 방법들도 포스팅 하도록 하겠습니다. 

 

- 이상 -

 

해당 예제 소스 

BasicCode/RecyclerviewPagingSample at master · jaekanglee/BasicCode (github.com)

 

jaekanglee/BasicCode

코드분리 하는 습관을 예시로 들기위한 프로젝트, 기본적으로 MVC를 가져간다 . Contribute to jaekanglee/BasicCode development by creating an account on GitHub.

github.com

초보 안드로이드 개발자 단톡 방
https://open.kakao.com/o/gn4xqQ6open.kakao.com/o/gH0XvThcopen.kakao.com/o/gH0XvThc

 

카카오톡 오픈채팅

 

open.kakao.com

 

 

Comments