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

깨미·2021년 6월 1일
0

📱 Android 📱

목록 보기
7/16
post-thumbnail
  • 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

0개의 댓글