안드로이드 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.디벨로퍼 사이트 참고하기
공식 홈페이지에서 정보를 찾아봐도 원하는 내용이 없었습니다.
2. 앱 디버깅해보기
scrollToPosition()에 Breakpoint를 걸고 앱을 디버깅해봤습니다. 하지만 디버깅 모드에서 문제가 발생하는 경우와 정상동작하는 경우 확인 가능한 java native단까지 비교해봐도 차이점을 찾을 수 없었습니다. 앱 디버깅으로 확인 안되는 부분에서 차이점이 있을 것으로 추측합니다.
3. 스택오버플로우 찾기
스택오버플로우에 비슷한 사례가 2건 정도 있었습니다. 2건 밖에 안된다는게 좀 이상하긴 하네요.
위의 글에서 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()를 이용해보시기 바랍니다.
댓글 영역