안드로이드 RecyclerView scrollToPosition이 제대로 동작하지 않을 때

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


문제현상

안드로이드에서 RecyclerView.scrollToPosition(mAdapter.getItemCount()-1)함수를 사용하여 RecyclerView에서 보여주는 리스트의 가장 마지막을 보여주도록 스크롤을 이동하도록하여 앱을 개발하고 있었습니다. 잘 동작하는 줄 알았는데 스크롤이 화면의 마지막으로 이동하지 않는 경우를 발견했습니다.


scrollToPosition 호출 위치에 대해 보겠습니다.


Fragment의 onActivityCreated()함수에서 showItemList()를 호출합니다.


1
2
3
4
5
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        showItemList();
    }
cs


그리고 showItemList()의 마지막에 스크롤을 화면의 마지막으로 내리기 위해 scrollToPostion을 호출하도록 되어있었습니다.

1
2
3
4
    public void showItemList(){
            ...생략...
            mRecyclerView.scrollToPosition(mAdapter.getItemCount()-1);
    }
cs


RecyclerView를 포함하는 Fragment가 처음 실행될 때는 스크롤이 마지막으로 잘 이동했으나, 다른 Fragment로 전환되었다가 다시 RecyclerView를 포함하는 Fragment로 돌아간 경우에는 이상하게도 scrollToPosition()함수가 실행됐음에도 스크롤이 마지막으로 이동하지 않았고 기존의 스크롤 위치가 그대로 유지됐습니다.




분석 및 해결방법

1.디벨로퍼 사이트 참고하기

공식 홈페이지에서 정보를 찾아봐도 원하는 내용이 없었습니다.

https://developer.android.com/reference/android/support/v7/widget/LinearLayoutManager.html#scrollToPosition(int)



2. 앱 디버깅해보기

scrollToPosition()에 Breakpoint를 걸고 앱을 디버깅해봤습니다. 하지만 디버깅 모드에서 문제가 발생하는 경우와 정상동작하는 경우 확인 가능한 java native단까지  비교해봐도 차이점을 찾을 수 없었습니다. 앱 디버깅으로 확인 안되는 부분에서 차이점이 있을 것으로 추측합니다.



3. 스택오버플로우 찾기

스택오버플로우에 비슷한 사례가 2건 정도 있었습니다. 2건 밖에 안된다는게 좀 이상하긴 하네요.


https://stackoverflow.com/questions/40077807/android-recyclerview-scrolltoposition-not-scrolling-to-bottom-of-view


위의 글에서 Handler().postDelayed()를 이용해서 약간의 대기 시간을 준 다음에 scrollToPosition()가 실행되도록 하라고 합니다.

위의 글에서는 smoothScrollToPosition()을 사용했지만 scrollToPosition()과 smoothScrollToPosition() 모두 Handler().postDelayed()를 사용하니까

원하는 대로 동작을 합니다.


1
2
3
4
5
6
7
8
9
10
    public void showItemList(){
        ...생략...
 
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                mRecyclerView.scrollToPosition(mAdapter.getItemCount()-1);
            }
        }, 200);
    }
cs


스크롤이 이동하지 않는 문제가 왜 발생하는지 정확한 원인은 알 수 없지만 저처럼 이런 문제를 만나신다면 위의 코드와 같이 Handler()를 이용해보시기 바랍니다.

작성자

Posted by 드리머즈

관련 글

댓글 영역