Recyclerview에서 databinding 하여 viewmodel에서 MutableLiveData의 value를 넣을 때마다(데이터를 추가할 때마다) 스크롤이 계속 위로 올라가는 현상이 있었다. 본인은 통신 받은 데이터를 Recyclerview 에 계속 추가하는 형태인데 이렇게 데이터가 추가될 때마다 스크롤이 처음으로 올라가서 밑에 데이터를 확인하는 데 어려움이 있었다.
해결한 방법
1. 현재 보이는 화면에서 가장 위에 있는 Item Position을 기록하여 layoutManager의 scrollToPosition에 넣어주기.
val scrollPosition = layoutManager.findFirstCompletelyVisibleItemPosition()
detailList.value = parameter
layoutManager.scrollToPosition(scrollPosition)
2. Observer 안에서 notifyDataSetChanged() 하기(적용)
이전 Observer 코드 :
val dataObserver: Observer<ArrayList<Detail>> =
Observer { livedata ->
detailList.value = livedata
binding?.detailRecyclerView?.adapter = ItemAdapter(detailList)
}
바꾼 Observer 코드 :
binding?.detailRecyclerView?.adapter = ItemAdapter(detailList)
val dataObserver: Observer<ArrayList<Detail>> =
Observer { livedata ->
detailList.value = livedata
binding?.detailRecyclerView?.adapter?.notifyDataSetChanged()
}
이전에는 Observer 안에서 계속 adapter를 갱신(?) 해주는 형태였지만, Recyclerview를 databinding 하지 않는 기본 방법을 참고 하여
Ex :
val recyclerView: RecyclerView = binding.root.findViewById(R.id.detailRecyclerView)
itemAdapter = ItemAdapter(detailList)
linearLayoutManager = LinearLayoutManager(activity)
recyclerView.layoutManager = linearLayoutManager
recyclerView.adapter = itemAdapter
detailList.add(detail) //데이터 추가
itemAdapter.notifyDataSetChanged()
이전에 binding recyclerview adapter에서 adapter를 설정하고 Observer가 불려질 때마다 notifyDataSetChanged()를 사용하도록 한다.
이렇게 바꾸니 계속 recyclerview에 데이터가 추가돼도 스크롤이 처음으로 돌아가지 않았다.