관련코드는 Github에 넘쳐납니다. 저도 가끔은 참고를 하니까요.
MVVM에서 ViewModel의 역할은 Model를 통해서 가져온 데이터를 View가 화면에 그려주기 쉽도록 가공해서 뷰에 전달해 주는 겁니다. 따라서 RecyclerView Adapter에 필요한 데이터는 ViewModel로 부터 제공이 되어야 하고 Adapter에 데이터가 추가되어야 한다면 ViewModel에 있는 데이터 소스에 먼저 반영이 되고 이 결과가 View로 전달이 되어야 합니다 즉, 데이터 흐름의 방향은
View -> ViewModel -> Model, Model -> ViewModel -> View 의 한 방향이 됩니다.
그리고 DiffUtil이 역할은 RecyclerView를 효율적으로 업데이트 하기 위해 존재하는 겁니다. 실제 변경이 된 아이템만 다시 그려줄 수 있도록 말이죠. 이걸 ViewModel쪽에 두자면 그럴 수도 있을 겁니다 .하지만 제 생각으로는 ViewModel보다는 View쪽에서 처리하는 것이 덜 복잡해진다고 생각해요. ViewModel에서 너무 많은 일을 할 필요는 없습니다.
대략적으로 아래처럼 코드가 흘러갈겁니다.
// View
viewModel.itemsLiveData.observe(viewLifeCycleObserver) { items ->
adapter.submitList(item)
}
addButton.setOnClickListener {
viewModel.addItemClicked(item)
}
// ViewModel
private val useCase: AddItemUseCase
fun addItemClicked(item: Item) {
viewMoelScope.launch {
val result = useCase.addItem(item)
if (!result.isSuccess) {
return@launch errorLiveData.postValue(result.error)
}
val items = useCase.getItems()
itemsLiveData.postValue( items.toAdapterItems())
}
}