
MVVM架构,将整个应用分为三层,View层,VM层,Model层。其中View层单向引用VM层,VM层单向引用Model层。如上图。
单向引用,而非双向引用,这是MVVM与MVP最大的区别。View层,只是单向引用VM层,VM层不需要引用View层,但是却可以
更新View层。这是通过VM层的观察者模式实现的,在这里使用架构组件LiveData,观察者注册LiveData,当LiveData数据发生变更
的时候,就会通知注册的观察者。
VM层,执行业务逻辑,获取Model层的数据,Model层的数据由repository来提供。
举例子:
ChooseAreaFragment是View层,它持有ViewModel,它可以监听相关数据,相关数据发生变化的时候,对应的UI就会被更新。
比如:dataChanged数据发生变化,就会执行定义的观察者操作。
viewModel.dataChanged.observe(this, Observer {
adapter.notifyDataSetChanged()
listView.setSelection(0)
closeProgressDialog()
})
class ChooseAreaFragment : Fragment() { private val viewModel by lazy { ViewModelProviders.of(this, InjectorUtil.getChooseAreaModelFactory()).get(ChooseAreaViewModel::class.java) } private var progressDialog: ProgressDialog? = null private lateinit var adapter: ArrayAdapter<String> override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view = inflater.inflate(R.layout.choose_area, container, false) val binding = DataBindingUtil.bind<ChooseAreaBindingImpl>(view) binding?.viewModel = viewModel return view } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) adapter = ChooseAreaAdapter(context!!, R.layout.simple_item, viewModel.dataList) listView.adapter = adapter observe() } private fun observe() { viewModel.currentLevel.observe(this, Observer { level -> when (level) { LEVEL_PROVINCE -> { titleText.text = "中国" backButton.visibility = View.GONE } LEVEL_CITY