JectPack架構學習系列二_LiveData

繼JectPack架構學習系列一_ViewModel.  所有的用戶界面數據放在ViewModel中管理,  還是不夠. 每次數據改變的時候都需要驅動視圖來驅動刷新控件.  比如用戶按鈕, 數據遞增之後要改變數據 綁定數據.  那麼ViewModel中的數據可以用LiveData來表示.  當數據發生改變的時候, 可以加一個觀察者, 自動的刷新界面的數據, 從而減少交互,  Controller即是界面就進一步減少了簡化

首先, 定義ViewModel:

package com.hzhztech.livedatatest.viewmodel;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class ViewModelWithLiveData extends ViewModel {

    private MutableLiveData<Integer> liveDataNumber;

    public MutableLiveData<Integer> getLiveDataNumber() {
        if(liveDataNumber == null) {
            liveDataNumber = new MutableLiveData<>();
            liveDataNumber.setValue(0);
        }
        return liveDataNumber;
    }

    public void addLiveDataNumber(int n) {
        liveDataNumber.setValue(liveDataNumber.getValue() + n);
    }
}

然後在Controller中使用

package com.hzhztech.livedatatest

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ImageButton
import android.widget.TextView
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.hzhztech.livedatatest.viewmodel.ViewModelWithLiveData
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    lateinit var viewModelWithLiveData: ViewModelWithLiveData

    lateinit var textView:TextView
    lateinit var imageButton:ImageButton
    lateinit var imageButton2:ImageButton

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView = findViewById(R.id.textView)
        imageButton = findViewById(R.id.imageButton)
        imageButton2 = findViewById(R.id.imageButton2)

        viewModelWithLiveData = ViewModelProviders.of(this).get(ViewModelWithLiveData::class.java)
        //LifecyclerOwener  activity就是擁有LifecyclerOwener的對象
        //observe 之後也不需要取消觀察, 在activity銷燬之後  系統會自動取消銷燬
        viewModelWithLiveData.liveDataNumber.observe(this,object :Observer<Int> {
            override fun onChanged(t: Int?) {
                textView.text = t.toString()
            }

        })

        imageButton.setOnClickListener {
            viewModelWithLiveData.addLiveDataNumber(1)
        }
        imageButton2.setOnClickListener {
            viewModelWithLiveData.addLiveDataNumber(-1)
        }

    }
}

observe函數非常關鍵

在控制器中對MutableLiveData 進行觀察, 那麼程序的獨立性進一步得到了提升

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章