안드로이드 RecyclerView가 view를 보여줄 상태가 완료된 시점 알아내기

프로그래밍/Android 관련2018. 2. 18. 23:09

안녕하세요. 개발자 드리머즈입니다.


안드로이드에서 RecyclerView를 사용하고 있는데 화면에 RecyclerView에서 목록으로 보여주는 View가 모두 보여질 상태가 완료된 시점을 파악하는 것이 필요했습니다.

설명이 좀 어려운데 예를 들어 설명하겠습니다.





RecyclerView에서 보여줄 데이터의 갯수에 따라서 한 화면에 한번에 보여줄 수도 있고(좌측 그림) 아니면 스크롤을 해야 전체 데이터를 볼 수도 있습니다. 이 두 경우를 구별할 방법이 필요했습니다. 다행히 LayoutManager(일반적으로는 LinearLayoutManager)에서 getChildCount()함수를 통해 recyclerView에 보여지고 있는 item의 갯수를 알 수 있고 getItemCount()함수를 통해 전체 item의 갯수를 알 수 있습니다. 

문제는 이 두 함수를 원하는 시점에 호출하기가 어려웠다는 점입니다. 만약 RecyclerView의 item 총 갯수가 9개라고 하면 RecyclerView가 실행되면서 getChildCount()값은 0에서부터 1씩 증가합니다. 화면이 작아서 한 번에 4개의 item만 보여줄 수 있다면 getChildCount()함수의 리턴값은 4에서 멈춥니다. 그래서 이 시점에 getChildCount() 값과 getItemCount()을 조사하면 한 번에 화면에 보여줄 수 있는 item의 갯수보다 많은지 아니면 적은지 알 수 있습니다. 그런데 이 시점을 찾기가 어려웠습니다.

RecyclerView나 RecyclerView.Adapter에 이 시점에 불리는 콜백 함수가 당연히 있겠지 하고 찾아봤지만 없었습니다. 스택오버플로우를 찾아봐도 명확하게 원하는 답을 찾지 못했습니다.

삽질을 좀 하다가 알게됐는데 문제가 되는 이 시점에 LayoutManager의 onLayoutCompleted()함수가 호출됩니다.

그래서 이 시점을 알기 위해서는 아래와 같은 방식으로 onLayoutCompleted()함수를 override해주면 됩니다. 이 함수가 호출될 때 getChildCount()와 getItemCount()값을 조사하면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
mLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext()){
    @Override
    public void onLayoutCompleted(RecyclerView.State state) {
        super.onLayoutCompleted(state);
        int childCount = getChildCount(); //지금 recyclerView 영역에 보이고 있는 아이템의 갯수
        int itemCount = getItemCount(); //전체 갯수
 
        if(childCount == itemCount){
            //한 화면에 보여줄 수 있는 item갯수보다 적은 갯수를 가지고 있음
        }else{
            //한 화면에 보여줄 수 있는 item갯수보다 많은 갯수를 가지고 있음
        }
    }
};
cs



작성자

Posted by 드리머즈

관련 글

댓글 영역