LiveData, ArrayList & notify

MutableLiveData 에 ArrayList 타입을 사용할 경우 ArrayList 에 아이템을 추가하거나 변경해도 LiveData – notify 가 일어나지 않습니다. LiveData 에 observe() 를 걸어도 이벤트가 발생하지 않습니다.

이 경우 LiveData 에서 강제로 notify 를 해줘야 합니다. 즉, LiveData.value 에 새로운 ArrayList 를 할당해줘야 이벤트가 발생합니다. 보통 RecyclerView 에 설정한 Adapter 가 LiveData 와 연결되어야 하는 경우 이런 문제가 자주 나올 것입니다.

이때는 MutableLiveData 를 상속한 클래스를 만들어서 사용하면 조금 더 편리하게 사용할 수 있을겁니다.

class ListLiveData<T> : MutableLiveData<ArrayList<T>>() {
    init {
        value = ArrayList()
    }

    fun add(item: T) {
        val items: ArrayList<T>? = value
        items!!.add(item)
        value = items
    }

    fun addAll(list: List<T>) {
        val items: ArrayList<T>? = value
        items!!.addAll(list)
        value = items
    }

    fun clear(notify: Boolean) {
        val items: ArrayList<T>? = value
        items!!.clear()
        if (notify) {
            value = items
        }
    }

    fun remove(item: T) {
        val items: ArrayList<T>? = value
        items!!.remove(item)
        value = items
    }

    fun notifyChange() {
        val items: ArrayList<T>? = value
        value = items
    }
}

notify 이벤트를 발생하기 위해 LiveData.value 를 재할당하도록 되어 있습니다.

ArrayList 에 아이템 추가 삭제가 필요할 경우 ListLiveData 에 있는 add/clear/remove 함수를 사용하면 됩니다.

yourListLiveData.observe(this, Observer<ArrayList<Item>> {
    vmListAdapter.replaceItems(it)
    vmListAdapter.notifyDataSetChanged()
})

.

You may also like...