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() })
.