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()를 호출해 데이터가 바뀌더라도 현재 스크롤한 위치가 바뀌지 않을 것이다.
반응형