본문 바로가기

안드로이드/Report

RecyclerView 사용시 끊김현상 없애는 방법

안드로이드 앱에서 각종 리스트를 사용자에게 보여줄 경우가 있다. 이 때 RecyclerView를 사용해서 보여주게 되는데 새로운 목록을 불러오거나 목록의 내용이 변경될 경우 RecyclerView가 깜빡이면서 전체 리스트가 고쳐지는 경우가 있다. 이는 RecyclerView의 Adapter 구현을 정확히 하지 않았기 때문에 발생하는 현상이다.

Adapter에서는 아래와 같은 메서드를 제공해 Adapter의 item들을 새로고침해주는 방식을 제공한다.

 

notifyDataSetChanged() // 해당 Adapter의 모든 데이터를 변경 (전체 새로고침)
notifyItemChanged(position: Int, payload: Any?) // position의 데이터에 대해 변경
notifyItemRangeChanged(positionStart: Int, itemCount: Int, payload: Any?) // positionStart로 부터 itemCount 만큼 변경
notifyItemInserted(position: Int) // position에 삽입된 데이터에 대해 변경
notifyItemMoved(fromPosition: Int, toPosition: Int) // fromPosition으로 부터 toPosition으로 이동된 데이터 변경
notifyItemRangeInserted(positionStart: Int, itemCount: Int) // positionStart로 부터 itemCount 만큼 삽입된 데이터 변경
notifyItemRangeRemoved(positionStart: Int, itemCount: Int) // positionStart로 부터 itemCount 만큼 삭제된 데이터 변경
notifyItemRemoved(position: Int) // position 데이터 삭제에 대한 변경

 

변경할 목록의 위치를 정확히 알고 있다면 위의 메서드를 통해 처리해줄 수 있다.

 

Adapter의 데이터에 id값을 부여해 해당 id로 판단하게 할 수 있다. 이 방법을 사용하는 경우는 목록에서 체크박스를 보여줘야 하는 경우(데이터 삭제, 선택 등) item layout 변경시에 화면이 끊기는 현상을 없앨 수 있다. 방법은 아래와 같다.

 

Adapter를 구현한 클래스에서 getItemId(position: Int) 메서드를 오버라이드 해주고 해당 Adapter를 RecyclerView에 지정할 때 Adatper.setHasStableIds(true)를 해주면 된다.

 

아래는 예제 코드이다.

 

MyAdapter(items: List<Int>): RecyclerView.Adapter<MyAdapter.ViewHolder>() {
	...
     override fun getItemId(position: Int): Long {
        return mItems[position].run {
            length() + lastModified() + hashCode()
        }
    }   
    ...
}

MyActivity: AppCompaatActivity() {
	...
    override fun onCreate(saveInstanceState: Bundle?) {
    	val items = listOf(1,2,3)
    	findViewById<RecyclerView>(R.id.recyclerView).run {
        	adapter = DirAdapter(items).apply { 
                setHasStableIds(true)
            }
        }
    }
    ...
}

 

참고

https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.html

 

RecyclerView  |  Android 개발자  |  Android Developers

 

developer.android.com