프래그먼트 태그를 사용하여 프래그먼트 자체를 보존하기 & sharedViewModel을 사용하여 데이터 유지시키기 두 가지 방법으로 뷰모델의 데이터는 유지할 수 있으나(전자는 프래그먼트 보존, 후자는 뷰모델 보존), 두 가지 방법 모두 화면이 회전함에 따라 onViewCreated를 새로 타게 됨. 그러므로 onViewCreated에 존재하는 로직 모두가 재시작되고 RecyclerView의 Adapter도 새로 붙게 됨.
SwipeRefreshLayout를 사용하고 있을 때 스와이프하면 하는 동시에 내부 RecyclerView의 ScrollLisenter가 반응하고, 스와이프가 끝나고 새로운 리스트가 추가된 이후에도 ScrollListener가 반응하여 데이터 로드가 2번 불리는 현상이 발생
해결 방법
RecyclerView에 보내는 리스트를 뷰모델의 LiveData로 보존하고, 새로운 데이터를 읽어오면 해당 LiveData에 추가하는 방식으로 데이터 리스트를 유지함.
ScrollListener 내부 if문에 SwipeRefreshLayout.isRefreshing 조건을 추가하여 방어함.
기타
page 변수 관리를 위해 Pager 클래스 구현
Restaurants가 아닌 Restaurant가 맞기에 이름 수정
UI 화면에선 Restaurant 객체가 아닌 List<Content>가 필요하기 때문에 필요한 데이터만 전달하도록 뷰모델에 restaurantState, contentList 라이브데이터를 두고 UI단에서 State에 따라 데이터가 주입되도록 수정 (추후 에러화면이 추가되거나 로드에 실패할 때의 처리가 필요할 수도 있으므로 UiState 라이브데이터와 필요한 데이터를 가지는 라이브데이터를 분리하는게 옳다.)
문제 원인
sharedViewModel
을 사용하여 데이터 유지시키기 두 가지 방법으로 뷰모델의 데이터는 유지할 수 있으나(전자는 프래그먼트 보존, 후자는 뷰모델 보존), 두 가지 방법 모두 화면이 회전함에 따라 onViewCreated를 새로 타게 됨. 그러므로onViewCreated
에 존재하는 로직 모두가 재시작되고RecyclerView
의Adapter
도 새로 붙게 됨.SwipeRefreshLayout
를 사용하고 있을 때 스와이프하면 하는 동시에 내부RecyclerView
의ScrollLisenter
가 반응하고, 스와이프가 끝나고 새로운 리스트가 추가된 이후에도ScrollListener
가 반응하여 데이터 로드가 2번 불리는 현상이 발생해결 방법
RecyclerView
에 보내는 리스트를 뷰모델의LiveData
로 보존하고, 새로운 데이터를 읽어오면 해당LiveData
에 추가하는 방식으로 데이터 리스트를 유지함.ScrollListener
내부if
문에SwipeRefreshLayout.isRefreshing
조건을 추가하여 방어함.기타
page
변수 관리를 위해Pager
클래스 구현Restaurants
가 아닌Restaurant
가 맞기에 이름 수정Restaurant
객체가 아닌List<Content>
가 필요하기 때문에 필요한 데이터만 전달하도록 뷰모델에restaurantState
,contentList
라이브데이터를 두고 UI단에서State
에 따라 데이터가 주입되도록 수정 (추후 에러화면이 추가되거나 로드에 실패할 때의 처리가 필요할 수도 있으므로UiState
라이브데이터와 필요한 데이터를 가지는 라이브데이터를 분리하는게 옳다.)