나만의 AI/안드로이드 도와줘

Android kotlin [ViewModel 알려줘]

정혜현 2024. 8. 1. 23:21

Q. 어떻게 사용해?

A. 

 

 

model - ViewModel.kt 클래스

class ViewModel : ViewModel() {
private val _quantity = MutableLiveData<Int>(0)
val quantity: LiveData<Int> = _quantity

private val _flavor = MutableLiveData<String>("")
val flavor: LiveData<String> = _flavor

private val _date = MutableLiveData<String>("")
val date: LiveData<String> = _date

private val _price = MutableLiveData<Double>(0.0)
val price: LiveData<Double> = _price

init {
   resetOrder()
}
//외부에서 사용하므로 퍼블릭하게 입력. 프래그먼트에서 사용
fun setQuantity(numberCupcakes: Int) {
    _quantity.value = numberCupcakes
}
fun setFlavor(desiredFlavor: String) {
    _flavor.value = desiredFlavor
}
fun setDate(pickupDate: String) {
    _date.value = pickupDate
}
//주문의 맛이 설정되었는지 여부를 확인하는 메서드. 프래그먼트에서 사용
fun hasNoFlavorSet(): Boolean {
    return _flavor.value.isNullOrEmpty()
}
fun resetOrder() {
   _quantity.value = 0
   _flavor.value = ""
   _date.value = dateOptions[0]
   _price.value = 0.0
}

}

 

 


공유 뷰모델sharedViewModel

 

gradle

implementation("androidx.fragment:fragment-ktx:1.8.2")

 

뷰모델

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

 

1. 액티비티 뷰모델을 프래그먼트와 공유하는 경우

액티비티

//최상단
private lateinit var mainViewModel : MainViewModel
//onCreate초기화
 mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)

 

프래그먼트

private val sharedViewModel: MainViewModel by activityViewModels()

 

2. 프래그먼트 뷰모델을 자식 프래그먼트와 공유하는 경우

 

private val sharedViewModel: FragmentViewModel by viewModels({requireParentFragment})

 

 

Q. 언제 썼어?

A. 

class MainViewModel : ViewModel() {

    //검색결과
    private val _searchResultLiveData = MutableLiveData<MutableList<ContentModel>?>()
    val searchResultLiveData: LiveData<MutableList<ContentModel>?> = _searchResultLiveData

    //검색어
    private val _searchWordLiveData = MutableLiveData<String>()
    val searchWordLiveData: LiveData<String> = _searchWordLiveData

    //검색필터
    private val _searchFilterLiveData = MutableLiveData<String>("전체")
    val searchFilterLiveData: LiveData<String> = _searchFilterLiveData

    //보관함.마이컨텐츠
    private val _myContentLiveData = MutableLiveData<MutableList<ContentModel>>()
    val myContentLiveData: LiveData<MutableList<ContentModel>> = _myContentLiveData
    private val myContentList = _myContentLiveData.value ?: mutableListOf()

    //검색결과
    fun receivedSearchResult(content: MutableList<ContentModel>) {
        _searchResultLiveData.value = content
    }

    //전체 검색결과
    fun receivedMergedSearchResult(
        image: MutableList<ContentModel>,
        video: MutableList<ContentModel>
    ) {
        _searchResultLiveData.value = image
        _searchResultLiveData.value?.addAll(video)
    }

    //검색어
    fun updateSearchWord(search: String) {
        _searchWordLiveData.value = search
    }

    //필터
    fun updateFilter(filter: String) {
        _searchFilterLiveData.value = filter
    }

    //클릭된 컨텐츠 보관함에 추가하는 함수
    fun addContent(content: ContentModel) {
        myContentList.add(content)
        _myContentLiveData.value = myContentList
    }

    //저장된 컨텐츠 보관함에서 삭제하는 함수
    fun removeContent(content: ContentModel) {
        _searchResultLiveData.value?.find { it.thumbnail == content.thumbnail }?.selectedContent =
                false
        myContentList.remove(content)
        _myContentLiveData.value = myContentList
    }

    //모든 저장된 컨텐츠 보관함에서 삭제하는 함수
    fun removeAllContent() {
        myContentList.forEach { i ->
            _searchResultLiveData.value?.find { it.thumbnail == i.thumbnail }?.selectedContent =
                false
        }
        myContentList.clear()
        _myContentLiveData.value = myContentList
    }

    //저장된 컨텐츠 복원하는 함수
    fun backUpContent(content: MutableList<ContentModel>) {
        myContentList.clear()
        myContentList.addAll(content)
        _myContentLiveData.value = myContentList
    }

    //저장된 컨텐츠 표시 반영하는 함수
    fun findMyContent() {
        myContentList.forEach { i ->
            _searchResultLiveData.value?.find { it.thumbnail == i.thumbnail }?.selectedContent =
                true
        }
        _searchResultLiveData.value?.forEach { i ->
            myContentList.find { it.thumbnail == i.thumbnail }?.selectedContent =
                true
        }
    }
}