공부가 끝나고 난 후...
오늘은 레포지토리 패턴을 기존 과제(주소록)에 적용시켜보았습니다.
코드가 너무 많아서 적용한 방법을 설명하기만 하겠습니다.
먼저, 기본적인 데이터를 contactList를 통해 받아옵니다.
이 과정에서 loadContactData로 연락처 목록을 받아오게 됩니다.
그리고, 이 기본적인 데이터들을 DataSource라는 오브젝트로 이런 기본적인 데이터들의 집합을 가져옵니다.
그리고 getContactList() 함수를 통해 이 데이터들을 가져옵니다.
이후, 이 데이터들을 레포지토리를 거쳐서 정제 과정을 거칩니다.
이때, 레포지토리 클래스에 DataSource 의존성 주입을 합니다.
그리고 그 레포지토리 인스턴스를 뷰모델에서 의존성 주입을 하고, 뷰모델 팩토리로 뷰모델 객체를 받아옵니다.
아직 완벽하게 적용시키진 못했지만, 일단 뷰모델 코드만 올려보겠습니다.
package com.android.nbc_c_assignment1.challenge4_1.presentation.main
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewmodel.CreationExtras
import com.android.nbc_c_assignment1.challenge4_1.data.database.DataSource
import com.android.nbc_c_assignment1.challenge4_1.data.entity.ContactListDataEntity
import com.android.nbc_c_assignment1.challenge4_1.data.repository.ContactListRepositoryImpl
import com.android.nbc_c_assignment1.challenge4_1.presentation.model.ContactListDataModel
import com.android.nbc_c_assignment1.challenge4_1.presentation.repository.ContactListRepository
class ContactListViewModel(private val contactListRepository: ContactListRepository) : ViewModel() {
private val _contactListData = MutableLiveData<List<ContactListDataModel>>()
val contactListData: LiveData<List<ContactListDataModel>> get() = _contactListData
fun setContactListData() {
_contactListData.value = contactListRepository.getContactList().sortModel()
}
fun setFavorite(position: Int) {
val isFavorite = contactListData.value?.get(position)?.isFavorite
changeFavorite(position, isFavorite ?: false)
}
private fun changeFavorite(position: Int, isFavorite: Boolean) {
_contactListData.value = contactListData.value?.mapIndexed { index, item ->
if(position == index) {
ContactListDataModel(
item.img,
item.name,
item.phoneNumber,
!isFavorite
)
} else {
ContactListDataModel(
item.img,
item.name,
item.phoneNumber,
item.isFavorite
)
}
}?.sortModel()
}
private fun List<ContactListDataModel>.sortModel(): List<ContactListDataModel> {
return this.sortedWith(
compareBy(
{ !it.isFavorite },
{ it.name },
)
)
}
fun getList() = contactListData.value
}
class ContactListViewmodelFactory: ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
return ContactListViewModel(
ContactListRepositoryImpl(DataSource)
) as T
}
}
내일도 열심히 공부해서 저 패턴을 완성하고 싶습니다...
끝.