Modify:创建ViewPager2的基础adapter封装。Fragment,Activity的数据状态帮助类重写封装。

This commit is contained in:
Dboy
2021-08-05 17:45:42 +08:00
parent 9e8863ea28
commit c89d700fac
13 changed files with 523 additions and 119 deletions

View File

@ -1,13 +1,17 @@
package com.quyunshuo.androidbaseframemvvm.base.mvvm.v
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.viewbinding.ViewBinding
import com.alibaba.android.arouter.launcher.ARouter
import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.BaseViewModel
import com.quyunshuo.androidbaseframemvvm.base.utils.*
import com.quyunshuo.androidbaseframemvvm.base.utils.BindingReflex
import com.quyunshuo.androidbaseframemvvm.base.utils.EventBusRegister
import com.quyunshuo.androidbaseframemvvm.base.utils.EventBusUtils
import com.quyunshuo.androidbaseframemvvm.base.utils.network.AutoRegisterNetListener
import com.quyunshuo.androidbaseframemvvm.base.utils.network.NetworkStateChangeListener
import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper
import com.quyunshuo.androidbaseframemvvm.base.utils.status.imp.BaseFrameViewStatusHelperImp
import com.quyunshuo.androidbaseframemvvm.base.utils.toast
/**
* Activity基类
@ -15,7 +19,7 @@ import com.quyunshuo.androidbaseframemvvm.base.utils.network.NetworkStateChangeL
* @author Qu Yunshuo
* @since 8/27/20
*/
abstract class BaseFrameActivity<VB : ViewBinding, VM : BaseViewModel> : AppCompatActivity(),
abstract class BaseFrameActivity<VB : ViewBinding, VM : BaseViewModel> : BaseFrameStatusActivity(),
FrameView<VB>, NetworkStateChangeListener {
protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) {
@ -25,15 +29,13 @@ abstract class BaseFrameActivity<VB : ViewBinding, VM : BaseViewModel> : AppComp
protected abstract val mViewModel: VM
/**
* activity页面重建帮助类
* 基础UI状态管理工具 保存了是否重建的状态信息
*/
private var mStatusHelper: ActivityRecreateHelper? = null
private lateinit var mStatusHelper: BaseFrameViewStatusHelperImp
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(mBinding.root)
//处理保存的装填
mStatusHelper?.onRestoreInstanceStatus(savedInstanceState)
// ARouter 依赖注入
ARouter.getInstance().inject(this)
// 注册EventBus
@ -77,24 +79,13 @@ abstract class BaseFrameActivity<VB : ViewBinding, VM : BaseViewModel> : AppComp
toast(if (isConnected) "网络已连接" else "网络已断开")
}
override fun isRecreate(): Boolean = mStatusHelper?.isRecreate ?: false
override fun isRecreate(): Boolean = mStatusHelper.isRecreate
override fun onSaveInstanceState(outState: Bundle) {
if (mStatusHelper == null) {
//仅当触发重建需要保存状态时创建对象
mStatusHelper = ActivityRecreateHelper(outState)
} else {
mStatusHelper?.onSaveInstanceState(outState)
}
super.onSaveInstanceState(outState)
override fun onRegisterStatusHelper(): ViewStatusHelper? {
mStatusHelper = BaseFrameViewStatusHelperImp(super.onRegisterStatusHelper())
return mStatusHelper
}
/**
* - activity 重建帮助工具类
*/
private class ActivityRecreateHelper(savedInstanceState: Bundle? = null) :
ViewRecreateHelper(savedInstanceState)
override fun onDestroy() {
if (javaClass.isAnnotationPresent(EventBusRegister::class.java)) EventBusUtils.unRegister(
this

View File

@ -4,14 +4,14 @@ 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
import com.alibaba.android.arouter.launcher.ARouter
import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.BaseViewModel
import com.quyunshuo.androidbaseframemvvm.base.utils.BindingReflex
import com.quyunshuo.androidbaseframemvvm.base.utils.EventBusRegister
import com.quyunshuo.androidbaseframemvvm.base.utils.EventBusUtils
import com.quyunshuo.androidbaseframemvvm.base.utils.ViewRecreateHelper
import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper
import com.quyunshuo.androidbaseframemvvm.base.utils.status.imp.BaseFrameViewStatusHelperImp
/**
* Fragment基类
@ -19,7 +19,7 @@ import com.quyunshuo.androidbaseframemvvm.base.utils.ViewRecreateHelper
* @author Qu Yunshuo
* @since 8/27/20
*/
abstract class BaseFrameFragment<VB : ViewBinding, VM : BaseViewModel> : Fragment(), FrameView<VB> {
abstract class BaseFrameFragment<VB : ViewBinding, VM : BaseViewModel> : BaseFrameStatusFragment(), FrameView<VB> {
protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) {
BindingReflex.reflexViewBinding(javaClass, layoutInflater)
@ -28,9 +28,10 @@ abstract class BaseFrameFragment<VB : ViewBinding, VM : BaseViewModel> : Fragmen
protected abstract val mViewModel: VM
/**
* fragment状态保存工具
* 基础UI状态管理工具
*/
private var mStatusHelper: FragmentStatusHelper? = null
private lateinit var mBaseStatusHelper: BaseFrameViewStatusHelperImp
override fun onCreateView(
inflater: LayoutInflater,
@ -42,8 +43,6 @@ abstract class BaseFrameFragment<VB : ViewBinding, VM : BaseViewModel> : Fragmen
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//处理恢复
mStatusHelper?.onRestoreInstanceStatus(savedInstanceState)
// ARouter 依赖注入
ARouter.getInstance().inject(this)
// 注册EventBus
@ -54,28 +53,13 @@ abstract class BaseFrameFragment<VB : ViewBinding, VM : BaseViewModel> : Fragmen
initRequestData()
}
override fun isRecreate(): Boolean = mStatusHelper?.isRecreate ?: false
override fun isRecreate(): Boolean = mBaseStatusHelper.isRecreate
/**
* 页面可能重建的时候回执行此方法,进行当前页面状态保存
*/
override fun onSaveInstanceState(outState: Bundle) {
if (mStatusHelper == null) {
//仅当触发重建需要保存状态时创建对象
mStatusHelper = FragmentStatusHelper(outState)
} else {
mStatusHelper?.onSaveInstanceState(outState)
}
super.onSaveInstanceState(outState)
override fun onRegisterStatusHelper(): ViewStatusHelper? {
mBaseStatusHelper = BaseFrameViewStatusHelperImp(super.onRegisterStatusHelper())
return mBaseStatusHelper
}
/**
* - fragment状态保存帮助类
* - 暂时没有其他需要保存的--空继承
*/
private class FragmentStatusHelper(savedInstanceState: Bundle? = null) :
ViewRecreateHelper(savedInstanceState)
override fun onDestroy() {
if (javaClass.isAnnotationPresent(EventBusRegister::class.java)) EventBusUtils.unRegister(
this

View File

@ -0,0 +1,41 @@
package com.quyunshuo.androidbaseframemvvm.base.mvvm.v
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper
/**
* @author DBoy 2021/8/5 <p>
* - 文件描述 : 基础状态管理Activity
*/
open class BaseFrameStatusActivity : AppCompatActivity() {
/**
* 基础状态管理帮助类
*/
private var mBaseStatusHelper: ViewStatusHelper? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//注册状态帮助类
mBaseStatusHelper = onRegisterStatusHelper()
//恢复状态数据
mBaseStatusHelper?.onRestoreInstanceStatus(savedInstanceState)
}
/**
* 保存状态
*/
override fun onSaveInstanceState(outState: Bundle) {
mBaseStatusHelper?.onSaveInstanceState(outState)
super.onSaveInstanceState(outState)
}
/**
* 注册状态管理帮助类,子类重写此方法以注册帮助类。
* 每一层都有可能有自己的状态管理帮助类所以继承重写的时候需要将super的对象传入自己的帮助类构造函数中
*/
protected open fun onRegisterStatusHelper(): ViewStatusHelper? {
return null
}
}

View File

@ -0,0 +1,42 @@
package com.quyunshuo.androidbaseframemvvm.base.mvvm.v
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper
/**
* @author DBoy 2021/8/5 <p>
* - 文件描述 : 基础状态管理Fragment
*/
open class BaseFrameStatusFragment : Fragment() {
/**
* 基础状态管理帮助类
*/
private var mBaseStatusHelper: ViewStatusHelper? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//注册状态帮助类
mBaseStatusHelper = onRegisterStatusHelper()
//恢复状态数据
mBaseStatusHelper?.onRestoreInstanceStatus(savedInstanceState)
}
/**
* 保存状态
*/
override fun onSaveInstanceState(outState: Bundle) {
mBaseStatusHelper?.onSaveInstanceState(outState)
super.onSaveInstanceState(outState)
}
/**
* 注册状态管理帮助类,子类重写此方法以注册帮助类。
* 每一层都有可能有自己的状态管理帮助类所以继承重写的时候需要将super的对象传入自己的帮助类构造函数中
*/
protected open fun onRegisterStatusHelper(): ViewStatusHelper? {
return null
}
}

View File

@ -1,42 +0,0 @@
package com.quyunshuo.androidbaseframemvvm.base.utils
import android.os.Bundle
/**
* @author DBoy 2021/7/8
*
* - 文件描述 : 视图activityfragment重建帮助类
*/
open class ViewRecreateHelper(savedInstanceState: Bundle?=null) {
/**
* 重建标记key
*/
private val KEY_RECREATE = "recreate"
/**
* 是否重建
*/
var isRecreate = false
private set
init {
if (savedInstanceState!=null) {
this.onSaveInstanceState(savedInstanceState)
}
}
/**
* 恢复状态
*/
open fun onRestoreInstanceStatus(savedInstanceState: Bundle?) {
isRecreate = savedInstanceState?.getBoolean(KEY_RECREATE) ?: false
}
/**
* 保存状态
*/
open fun onSaveInstanceState(bundle: Bundle) {
bundle.putBoolean(KEY_RECREATE, true)
}
}

View File

@ -0,0 +1,18 @@
package com.quyunshuo.androidbaseframemvvm.base.utils.status
import android.os.Bundle
/**
* @author DBoy 2021/8/5 <p>
* - 文件描述 : 采用了一种链式调用,所有对象持有自己父级帮助类,进行场景回复时先恢复链头的数据
*/
abstract class ViewStatusHelper(val parentViewStatusHelper: ViewStatusHelper?) {
open fun onRestoreInstanceStatus(savedInstanceState: Bundle?) {
parentViewStatusHelper?.onRestoreInstanceStatus(savedInstanceState)
}
open fun onSaveInstanceState(bundle: Bundle) {
parentViewStatusHelper?.onSaveInstanceState(bundle)
}
}

View File

@ -0,0 +1,40 @@
package com.quyunshuo.androidbaseframemvvm.base.utils.status.imp
import android.os.Bundle
import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper
/**
* @author DBoy 2021/7/8
*
* - 文件描述 : 视图activityfragment重建帮助类
*/
open class BaseFrameViewStatusHelperImp(parentViewStatusHelper: ViewStatusHelper? = null) : ViewStatusHelper(parentViewStatusHelper) {
/**
* 重建标记key 以包名保存数据可以防止嵌套层级出现重复Key
*/
private val KEY_RECREATE = "com.quyunshuo.androidbaseframemvvm.base.utils.status.BaseFrameViewStatusHelperImp.Recreate"
/**
* 是否重建
*/
var isRecreate = false
private set
/**
* 恢复状态
*/
override fun onRestoreInstanceStatus(savedInstanceState: Bundle?) {
super.onRestoreInstanceStatus(savedInstanceState)
isRecreate = savedInstanceState?.getBoolean(KEY_RECREATE) ?: false
}
/**
* 保存状态
*/
override fun onSaveInstanceState(bundle: Bundle) {
super.onSaveInstanceState(bundle)
bundle.putBoolean(KEY_RECREATE, true)
}
}