1.代码
1.BaseFragment
package com.cniao5.mvvm.base
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.viewbinding.ViewBinding
/**
* 创建日期:2023/2/8 17:58
* @author 唐门.西门吹雪
* 类说明:fragment的基类
*
*/
abstract class BaseFragment<T : ViewBinding> : Fragment() {//表示泛型T为ViewBinding的子类
// TODO: 1.Base类中怎么使用ViewBingding
protected var mBinding:T?=null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
mBinding=initViewBinding(inflater)
return mBinding?.root?:super.onCreateView(inflater, container, savedInstanceState)
}
abstract fun initViewBinding(inflater: LayoutInflater): T?
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView(view)
initListener();
}
abstract fun initView(view: View)
open fun initListener(){}
private var hasInitData = false
override fun onResume() {
super.onResume()
if (!hasInitData){
lazyInitData()
hasInitData=true
}
}
//懒加载
abstract fun lazyInitData()
override fun onDestroy() {
super.onDestroy()
}
}
2.HomeFragment
package com.cniao5.mvvm.ui.home
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
import com.cniao5.mvvm.base.BaseFragment
import com.cniao5.mvvm.databinding.FragmentHomeBinding
private const val TAG = "HomeFragment"
class HomeFragment : BaseFragment<FragmentHomeBinding>() {
private var _binding: FragmentHomeBinding? = null
private val homeViewModel by viewModels<HomeViewModel>()
private val mAdapter by lazy {
Log.d(TAG, ": 适配器")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun initViewBinding(inflater: LayoutInflater): FragmentHomeBinding? {
return FragmentHomeBinding.inflate(inflater)
}
override fun initView(view: View) {
initLoadStatusObserve()
}
private fun initLoadStatusObserve() {
homeViewModel.loadStatus.observe(viewLifecycleOwner){status->
when(status){
LoadingViewStatus.LOADING->{
Log.d(TAG, "当数据不为空的时候,显示加载状态")
}
LoadingViewStatus.LOAD_EMPTY->{
Log.d(TAG, "如果有数据就关闭加载状态,没有就显示为空")
}
LoadingViewStatus.LOAD_ERROR->{
Log.d(TAG, "ERROR时的逻辑处理")
}
LoadingViewStatus.LOAD_SUCCESS->{
Log.d(TAG, "加载布局隐藏,关闭下拉控件,适配器更新")
}
}
}
}
override fun lazyInitData() {
homeViewModel.refreshData()
}
}
3.HomeViewModel
package com.cniao5.mvvm.ui.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class HomeViewModel : ViewModel() {
//请求状态数据
private val realLoadStatus: MutableLiveData<LoadingViewStatus> =
MutableLiveData<LoadingViewStatus>()
val loadStatus:LiveData<LoadingViewStatus> =realLoadStatus
private val _text = MutableLiveData<String>().apply {
value = "This is home Fragment"
}
val text: LiveData<String> = _text
fun refreshData() {
realLoadStatus.postValue(LoadingViewStatus.LOADING)//加载状态
/**
* 发起网络请求,下面呢,只会执行其中一种
* ……
*/
//如果是成功,不为空
realLoadStatus.postValue(LoadingViewStatus.LOAD_SUCCESS)
//如果是成功,为空
realLoadStatus.postValue(LoadingViewStatus.LOAD_EMPTY)
//如果是失败,网络错误
realLoadStatus.postValue(LoadingViewStatus.LOAD_ERROR)
//如果是失败,数据加载异常
realLoadStatus.postValue(LoadingViewStatus.LOAD_ERROR)
}
}
2.讲解
1.View层
1.BaseFragment
1.ViewBing的使用:主要传入泛型
2.布局的绑定
2.HomeFragment
1.持有Viewmodel并且调用网络请求的方法
2.通过获取ViewModel里面的liveData值设置观察者
2.ViewModel层
1.负责网络的请求,获取网络请求的状态,然后根据状态来设置liveData的值(被观察者)
3.model层
略