# Live Data & LiveData Observers
## [沿用viewModel的程式碼](https://hackmd.io/2jzgiOv1Sx27ZxByoReY6g?view)
## Live Data是一種observable data holder class,並且在資料變更時通知observers
1. ### 修改MainViewModel.kt
#### 將原本的count宣告為 MutableLiveData類型
#### 程式碼第2~4行是封裝寫法,分為內部與外部變數,_count是屬於內部運算使用,count是屬於要更新於UI的data
```kotlin=0
class MainViewModel : ViewModel() {
// TODO: Implement the ViewModel
private val _count = MutableLiveData<Int>()
val count : LiveData<Int>
get() = _count
// var count = 0
init {
_count.value = 0
}
//執行+1
fun onadd(){
_count.value = (count.value)?.plus(1)
// count++
}
//執行-1
fun ondes(){
_count.value = (count.value)?.minus(1)
}
override fun onCleared() {
super.onCleared()
}
}
```
2. ### 修改MainFragment.kt
#### 新增程式碼第29~30行,設定一個observer觀察count數值變化,一旦數值變化就執行第30行更新UI畫面
#### 因為已經設定observer來更新UI了,所以把updateData這個函數功能拿掉
#### 額外增加一個按鈕與函數,是執行-1的計算
```kotlin=0
class MainFragment : Fragment() {
companion object {
fun newInstance() = MainFragment()
}
private lateinit var binding : MainFragmentBinding
private lateinit var viewModel: MainViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View {
binding =DataBindingUtil.inflate(
inflater,
R.layout.main_fragment,
container,
false
)
return binding.root
// return inflater.inflate(R.layout.main_fragment, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Log.i("onViewCreated", "view created")
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
// TODO: Use the ViewModel
//註冊兩顆按鈕的click監聽器
binding.plus.setOnClickListener { madd() }
binding.minus.setOnClickListener { mdes() }
viewModel.count.observe(viewLifecycleOwner, Observer { newCount ->
binding.keepsave.text = newCount.toString()
})
// updateData()
}
//onActivityCreated 不會使用到,可以刪除了
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
Log.i("onActivityCreated", "onActivityCreated")
}
//執行加法運算
fun madd(){
viewModel.onadd()
// updateData()
}
//執行減法運算
fun mdes(){
viewModel.ondes()
}
// fun updateData(){
// binding.keepsave.text = viewModel.count.value.toString()
// binding.keepsave.text = viewModel.count.toString()
// }
}
```
### 以上
[參考資料] [code lab](https://developer.android.com/codelabs/kotlin-android-training-live-data#3)
###### tags: `kotlin` `Android` `Live Data`