[android] Recyclerview를 databinding 하여 데이터 추가 시 scroll이 처음으로 올라가는 현상

깨미·2021년 6월 1일
0

📱 Android 📱

목록 보기
7/16
post-thumbnail
post-custom-banner
  • Activity가 아닌 Fragment에서 ViewModel을 적용하였다.

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에 데이터가 추가돼도 스크롤이 처음으로 돌아가지 않았다.

profile
vis ta vie
post-custom-banner

0개의 댓글