728x90
반응형
SMALL
Next 버튼의 활성화/비활성화를 LiveData로 만들고 싶은데,
이에 영향을 주는 LiveData가 2개 이상입니다.
MediatorLiveData를 사용하면 여러개의 LiveData를 다시 mapping할 수 있습니다.
저는 무려 4개였습니다 ..ㅎㅎ
class MyViewModel(private val repository: Repository): ViewModel() {
val emg1Connected: LiveData<Boolean> = repository.deviceEmg1.connected
val emg2Connected: LiveData<Boolean> = repository.deviceEmg2.connected
val emg1Calibrated: LiveData<Boolean> = repository.deviceEmg1.calibrated
val emg2Calibrated: LiveData<Boolean> = repository.deviceEmg2.calibrated
}
이 4개의 LiveData를 하나의 LiveData로 합쳐보겠습니다.
val onNext: MediatorLiveData<Boolean> = MediatorLiveData()
먼저 합칠 MediatorLiveData를 만들어줍니다.
Next Button에 바인딩할 LiveData를 만들어야 합니다. (활성,비활성을 실시간으로 업데이트해야합니다.)
이제 여기에 source를 추가해주면됩니다. (단, 하나하나 해야합니다.)
저는 4개의 LiveData를 받아야하므로..
val onNext: MediatorLiveData<Boolean> = MediatorLiveData()
init{
onNext.addSource(emg1Calibrated) {
onNext.value = _onNext()
}
onNext.addSource(emg2Calibrated) {
onNext.value = _onNext()
}
onNext.addSource(emg1Connected) {
onNext.value = _onNext()
}
onNext.addSource(emg2Connected) {
onNext.value = _onNext()
}
}
이렇게 LiveData를 업데이트 해주면 됩니다.
private fun _onNext():Boolean {
if((emg1Connected.value==true) and (emg2Connected.value == true)){
return (emg1Calibrated.value) or (emg2Calibrated.value)
}else if(emg1Connected.value == true){
return emg1Calibrated.value
}else if(emg2Connected.value == true){
return emg2Calibrated.value
}
return false
}
각각의 LiveData의 값에 맞게 도출되는 값을 반환하는 메서드를 만들었습니다.
이 메서드에 의해 업데이트 된 변수(onNext)는 LiveData이므로 view에서 observing도 되고 data binding도 됩니다.
간단히 여러개의 LiveData를 mapping하기 위해 MediatorLiveData를 사용할 수 있었습니다. 굿!
아래 포스트도 참고해 보세요.
728x90
반응형
LIST