관리 메뉴

나만을 위한 블로그

[Android] 리사이클러뷰 스크롤 중 데이터가 변경될 때 현재 위치를 유지하는 방법 본문

Android

[Android] 리사이클러뷰 스크롤 중 데이터가 변경될 때 현재 위치를 유지하는 방법

참깨빵위에참깨빵 2021. 8. 12. 14:00
728x90
반응형

페이징 또는 TimerTask 등을 통해 메서드를 반복호출한 다음, 메서드 리턴값을 리사이클러뷰에 보여주고 notifyDataSetChanged()를 호출할 경우 스크롤이 맨 위로 올라갈 수 있다.

이번 포스팅에선 페이징해서 새 데이터를 가져오거나 리사이클러뷰 안의 데이터들이 바뀌더라도 현재 스크롤 위치를 유지하는 방법에 대해 포스팅하려 한다.

 

1. 먼저 액티비티/프래그먼트의 전역 변수로 아래를 선언한다.

private Parcelable recyclerViewState;

 

2. 그리고 어댑터 초기화 코드의 이전 부분에서 아래와 같이 사용한다. 프래그먼트에서 사용했기 때문에 context로 getActivity()를 넘겼지만 액티비티에서 사용한다면 MyActivity.this 등을 넘기면 될 것이다.

// 순서는 상관없을지도 모르지만 내 경우 이렇게 하면 작동했기 때문에 그냥 이렇게 쓰는 것이다
recyclerViewState = myRecyclerview.getLayoutManager().onSaveInstanceState();
adapter = new MyAdapter(getActivity(), firstList, secondList);

 

당연한 거지만 myRecyclerview에는 자신이 만든 리사이클러뷰의 참조 변수명을 넣어주면 된다. 저거 그대로 따라해놓고 왜 안되냐고 한다면 난 할 말이 없다.

 

3. recyclerViewState를 리사이클러뷰에 붙인다. 이 코드는 setAdapter 이후에 호출한다.

myRecyclerview.setAdapter(adapter);
myRecyclerview.getLayoutManager().onRestoreInstanceState(recyclerViewState);

 

이제 테스트해보면 스크롤 도중 페이징이나 notifyDataSetChanged()를 호출해 데이터가 바뀌더라도 현재 스크롤한 위치가 바뀌지 않을 것이다.

반응형
Comments