From c89d700fac6f87b911fb5afa3db7f8439df63395 Mon Sep 17 00:00:00 2001 From: Dboy <894230813@qq.com> Date: Thu, 5 Aug 2021 17:45:42 +0800 Subject: [PATCH] =?UTF-8?q?Modify:=E5=88=9B=E5=BB=BAViewPager2=E7=9A=84?= =?UTF-8?q?=E5=9F=BA=E7=A1=80adapter=E5=B0=81=E8=A3=85=E3=80=82Fragment?= =?UTF-8?q?=EF=BC=8CActivity=E7=9A=84=E6=95=B0=E6=8D=AE=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=B8=AE=E5=8A=A9=E7=B1=BB=E9=87=8D=E5=86=99=E5=B0=81=E8=A3=85?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/mvvm/v/BaseFrameActivity.kt | 35 ++-- .../base/mvvm/v/BaseFrameFragment.kt | 36 +--- .../base/mvvm/v/BaseFrameStatusActivity.kt | 41 ++++ .../base/mvvm/v/BaseFrameStatusFragment.kt | 42 +++++ .../base/utils/ViewRecreateHelper.kt | 42 ----- .../base/utils/status/ViewStatusHelper.kt | 18 ++ .../imp/BaseFrameViewStatusHelperImp.kt | 40 ++++ .../common/ui/BaseFragmentStateAdapter.kt | 176 ++++++++++++++++++ .../home/activity/InternalPagerActivity.kt | 76 ++++++-- .../module/home/fragment/InternalFragment.kt | 45 ++++- .../module/home/fragment/InternalViewModel.kt | 19 +- .../layout/home_activity_internal_layout.xml | 35 +++- .../layout/home_fragment_internal_layout.xml | 37 +++- 13 files changed, 523 insertions(+), 119 deletions(-) create mode 100644 lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusActivity.kt create mode 100644 lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusFragment.kt delete mode 100644 lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/ViewRecreateHelper.kt create mode 100644 lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/status/ViewStatusHelper.kt create mode 100644 lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/status/imp/BaseFrameViewStatusHelperImp.kt create mode 100644 lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/ui/BaseFragmentStateAdapter.kt diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt index 086f0c1..7967014 100644 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt @@ -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 : AppCompatActivity(), +abstract class BaseFrameActivity : BaseFrameStatusActivity(), FrameView, NetworkStateChangeListener { protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) { @@ -25,15 +29,13 @@ abstract class BaseFrameActivity : 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 : 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 diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameFragment.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameFragment.kt index bea9d6b..1151043 100644 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameFragment.kt +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameFragment.kt @@ -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 : Fragment(), FrameView { +abstract class BaseFrameFragment : BaseFrameStatusFragment(), FrameView { protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) { BindingReflex.reflexViewBinding(javaClass, layoutInflater) @@ -28,9 +28,10 @@ abstract class BaseFrameFragment : 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 : 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 : 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 diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusActivity.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusActivity.kt new file mode 100644 index 0000000..d1dbe54 --- /dev/null +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusActivity.kt @@ -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

+ * - 文件描述 : 基础状态管理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 + } + +} \ No newline at end of file diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusFragment.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusFragment.kt new file mode 100644 index 0000000..2b17e42 --- /dev/null +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameStatusFragment.kt @@ -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

+ * - 文件描述 : 基础状态管理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 + } + +} \ No newline at end of file diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/ViewRecreateHelper.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/ViewRecreateHelper.kt deleted file mode 100644 index 562ef69..0000000 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/ViewRecreateHelper.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.quyunshuo.androidbaseframemvvm.base.utils - -import android.os.Bundle - -/** - * @author DBoy 2021/7/8 - * - * - 文件描述 : 视图,activity,fragment重建帮助类 - */ -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) - } - -} \ No newline at end of file diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/status/ViewStatusHelper.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/status/ViewStatusHelper.kt new file mode 100644 index 0000000..924c04f --- /dev/null +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/status/ViewStatusHelper.kt @@ -0,0 +1,18 @@ +package com.quyunshuo.androidbaseframemvvm.base.utils.status + +import android.os.Bundle + +/** + * @author DBoy 2021/8/5

+ * - 文件描述 : 采用了一种链式调用,所有对象持有自己父级帮助类,进行场景回复时先恢复链头的数据 + */ +abstract class ViewStatusHelper(val parentViewStatusHelper: ViewStatusHelper?) { + + open fun onRestoreInstanceStatus(savedInstanceState: Bundle?) { + parentViewStatusHelper?.onRestoreInstanceStatus(savedInstanceState) + } + + open fun onSaveInstanceState(bundle: Bundle) { + parentViewStatusHelper?.onSaveInstanceState(bundle) + } +} \ No newline at end of file diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/status/imp/BaseFrameViewStatusHelperImp.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/status/imp/BaseFrameViewStatusHelperImp.kt new file mode 100644 index 0000000..07afef0 --- /dev/null +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/status/imp/BaseFrameViewStatusHelperImp.kt @@ -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 + * + * - 文件描述 : 视图,activity,fragment重建帮助类 + */ +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) + } + +} \ No newline at end of file diff --git a/lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/ui/BaseFragmentStateAdapter.kt b/lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/ui/BaseFragmentStateAdapter.kt new file mode 100644 index 0000000..b3544f8 --- /dev/null +++ b/lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/ui/BaseFragmentStateAdapter.kt @@ -0,0 +1,176 @@ +package com.quyunshuo.androidbaseframemvvm.common.ui + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager2.adapter.FragmentStateAdapter +import kotlin.random.Random + +/** + * @author DBoy 2021/8/5

+ * - 文件描述 : ViewPager2 FragmentAdapter封装 + * - 对于元数据[mData]的增加删除操作只能通过内部提供的4种方式进行操作: + * - [setNewData] + * - [addNewData] + * - [addData] + * - [removeData] + * - 内部使用[DiffUtil]工具实现更新UI,不需调用[notifyDataSetChanged]等一系列方法。 + */ +abstract class BaseFragmentStateAdapter : FragmentStateAdapter { + + private val TAG = "FragmentAdapter" + + /** + * 记录生成的Fragment id列表 + */ + private var mFragmentIdMap = mutableMapOf() + + /** + * 需要生成页面的数据 + */ + var mData: MutableList + set(value) { + field = value + mFragmentIdMap.clear() + createFragmentsIds(field) + } + + constructor(fragment: Fragment, data: MutableList = mutableListOf()) : super(fragment) { + mData = data + } + + constructor(activity: FragmentActivity, data: MutableList = mutableListOf()) : super( + activity + ) { + mData = data + } + + /** + * 获取需要创建几个Fragment + */ + override fun getItemCount(): Int = mData.size + + /** + * 创建Fragment + */ + final override fun createFragment(position: Int): Fragment { + return createFragment(mData[position], position) + } + + /** + * 创建fragment 传递数据 + */ + abstract fun createFragment(item: T, position: Int): Fragment + + /** + * 获取fragment 对应 id + */ + override fun getItemId(position: Int): Long { + if (position >= mData.size) return RecyclerView.NO_ID + return mFragmentIdMap[mData[position]] ?: return RecyclerView.NO_ID + } + + /** + * 判断是否包含这个id的数 + */ + override fun containsItem(itemId: Long): Boolean { + return mFragmentIdMap.values.contains(itemId) + } + + /** + * 设置新数据 + */ + fun setNewData(data: MutableList = mutableListOf()) { + val oldData = copyData() + mData = data + diffNotifyDataSetChanged(oldData, mData) + } + + /** + * 累加新数据 + */ + fun addNewData(data: MutableList = mutableListOf()) { + val oldData = copyData() + mData.addAll(data) + //创建新的对应位置的id + createFragmentsIds(data) + diffNotifyDataSetChanged(oldData, mData) + + } + + /** + * 添加数据 + */ + fun addData(data: T) { + val oldData = copyData() + mData.add(data) + //随机一个id对应当前位置Fragment,两次随机确保同id率为最低概率 + mFragmentIdMap[data] = Random.nextLong() - Random.nextInt() + diffNotifyDataSetChanged(oldData, mData) + } + + /** + * 移除某个数据 + */ + fun removeData(data: T): Boolean { + val oldData = copyData() + if (mData.remove(data)) { + mFragmentIdMap.remove(data) + diffNotifyDataSetChanged(oldData, mData) + return true + } + return false + } + + /** + * 移除某个位置的数据 + */ + fun removeData(position: Int): Boolean { + if (position < mData.size && position < mFragmentIdMap.size) { + val oldData = copyData() + val removeItem = mData.removeAt(position) + mFragmentIdMap.remove(removeItem) + diffNotifyDataSetChanged(oldData, mData) + return true + } + return false + } + + /** + * 拷贝原数据 + */ + private fun copyData(): MutableList { + val oldData = mutableListOf() + oldData.addAll(mData) + return oldData + } + + /** + * 使用diff工具更新UI,当前diff工具对比使用的方式是 [==] 所以如果需要精确对比不同item数据,可以重写[T]的[equals]方法. + */ + private fun diffNotifyDataSetChanged(oldData: MutableList, newData: MutableList) { + DiffUtil.calculateDiff(object : DiffUtil.Callback() { + + override fun getOldListSize(): Int = oldData.size + + override fun getNewListSize(): Int = newData.size + + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean = oldData[oldItemPosition] == newData[newItemPosition] + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean = oldData[oldItemPosition] == newData[newItemPosition] + + }, true).dispatchUpdatesTo(this) + } + + + /** + * 创建[mData]对应Fragment的id + */ + private fun createFragmentsIds(data: MutableList) { + for (item in data) { + mFragmentIdMap[item] = Random.nextLong() - Random.nextInt() + } + } + +} diff --git a/module_home/src/main/java/com/quyunshuo/module/home/activity/InternalPagerActivity.kt b/module_home/src/main/java/com/quyunshuo/module/home/activity/InternalPagerActivity.kt index cd9ec12..0b70886 100644 --- a/module_home/src/main/java/com/quyunshuo/module/home/activity/InternalPagerActivity.kt +++ b/module_home/src/main/java/com/quyunshuo/module/home/activity/InternalPagerActivity.kt @@ -1,13 +1,16 @@ package com.quyunshuo.module.home.activity +import android.os.Bundle import androidx.activity.viewModels import androidx.fragment.app.Fragment -import androidx.viewpager2.adapter.FragmentStateAdapter +import androidx.fragment.app.FragmentActivity import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.EmptyViewModel import com.quyunshuo.androidbaseframemvvm.common.ui.BaseActivity +import com.quyunshuo.androidbaseframemvvm.common.ui.BaseFragmentStateAdapter import com.quyunshuo.module.home.databinding.HomeActivityInternalLayoutBinding import com.quyunshuo.module.home.fragment.InternalFragment import dagger.hilt.android.AndroidEntryPoint +import kotlin.random.Random /** * @author DBoy 2021/7/6

@@ -18,28 +21,73 @@ class InternalPagerActivity : BaseActivity() + + private var mAdapter: InternalPagerFragmentAdapter? = null + + override fun HomeActivityInternalLayoutBinding.initView() { + addFragment.setOnClickListener { + //添加一个随机页面 + mAdapter?.addData("Pager ID:${Random.nextInt()}") + } + removeFragment.setOnClickListener { + //移除当前展示页面 +// mAdapter?.removeData("更多") + mAdapter?.removeData(viewPager.currentItem) + } initPager() } private fun initPager() { - val fragments = mutableListOf( - InternalFragment(), - InternalFragment(), - InternalFragment(), - InternalFragment(), - InternalFragment(), - InternalFragment(), - InternalFragment() - ) - mBinding.viewPager.adapter = object : FragmentStateAdapter(this) { - override fun getItemCount(): Int = fragments.size - override fun createFragment(position: Int): Fragment = fragments[position] - } + mCreateFragmentData.add("首页") + mCreateFragmentData.add("我的") + mCreateFragmentData.add("设置") + mCreateFragmentData.add("更多") + mCreateFragmentData.add("动态") + mAdapter = InternalPagerFragmentAdapter(this, mCreateFragmentData) + mBinding.viewPager.adapter = mAdapter } override fun initObserve() {} override fun initRequestData() {} + + class InternalPagerFragmentAdapter(activity: FragmentActivity, data: MutableList = mutableListOf()) : + BaseFragmentStateAdapter(activity, data) { + override fun createFragment(item: String, position: Int): Fragment { + val bundle = Bundle().apply { + putString("What", item) + } + return when (item) { + "首页" -> { + //假装首页 + InternalFragment() + } + "我的" -> { + //假装我的 + InternalFragment() + } + "设置" -> { + //假装设置 + InternalFragment() + } + "更多" -> { + //假装更多 + InternalFragment() + } + else -> { + //另外动态item创建类型 + InternalFragment() + } + }.apply { + //设置传递参数bundle + arguments = bundle + } + } + + + } + } \ No newline at end of file diff --git a/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalFragment.kt b/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalFragment.kt index d943666..e181538 100644 --- a/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalFragment.kt +++ b/module_home/src/main/java/com/quyunshuo/module/home/fragment/InternalFragment.kt @@ -1,6 +1,9 @@ package com.quyunshuo.module.home.fragment +import android.os.Bundle +import android.util.Log import androidx.fragment.app.viewModels +import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper import com.quyunshuo.androidbaseframemvvm.common.ui.BaseFragment import com.quyunshuo.module.home.databinding.HomeFragmentInternalLayoutBinding import dagger.hilt.android.AndroidEntryPoint @@ -14,9 +17,26 @@ class InternalFragment : BaseFragment() + /** + * 页面状态数据管理帮助类 + */ + private lateinit var mInternalFragmentStatusHelper: InternalFragmentStatusHelper + + /*** + * 注册帮助类 + */ + override fun onRegisterStatusHelper(): ViewStatusHelper? { + mInternalFragmentStatusHelper = InternalFragmentStatusHelper(super.onRegisterStatusHelper()) + return mInternalFragmentStatusHelper + } + override fun HomeFragmentInternalLayoutBinding.initView() {} + override fun initObserve() { + mViewModel.increase(mInternalFragmentStatusHelper.rebuildSize) + val s = arguments?.getString("What") ?: "" + mBinding.toolBarTitle.text = s mViewModel.recreatedCont.observe(viewLifecycleOwner) { mBinding.recreateContTv.text = "重建次数 $it" } @@ -33,12 +53,33 @@ class InternalFragment : BaseFragment - * - 文件描述 : + * - 文件描述 : ViewModel再ViewPager2的Fragment中会随着Fragment执行[Fragment.onDestory]一同销毁。 + * 所以一些需要长期保存的变量数据,不适合保存再ViewModel,考虑使用[ViewStatusHelper]保存页面上部分数据, + * 页面恢复的时候再交给ViewModel处理,例如[recreatedCont] */ @HiltViewModel -class InternalViewModel @Inject constructor(private val repository: InternalRepository) : +class InternalViewModel @Inject constructor() : BaseViewModel() { + @Inject + lateinit var repository: InternalRepository + /** * 重建计数 */ @@ -34,9 +40,8 @@ class InternalViewModel @Inject constructor(private val repository: InternalRepo /** * 累加重建次数 */ - fun increase() { - val value = recreatedCont.value ?: 0 - recreatedCont.value = value + 1 + fun increase(size: Int) { + recreatedCont.value = size } /** @@ -57,8 +62,4 @@ class InternalViewModel @Inject constructor(private val repository: InternalRepo } } - override fun onCleared() { - super.onCleared() - Log.d("DJC", "InternalViewModel Clear") - } } diff --git a/module_home/src/main/res/layout/home_activity_internal_layout.xml b/module_home/src/main/res/layout/home_activity_internal_layout.xml index ad24de9..afe1254 100644 --- a/module_home/src/main/res/layout/home_activity_internal_layout.xml +++ b/module_home/src/main/res/layout/home_activity_internal_layout.xml @@ -1,12 +1,45 @@ + android:layout_height="0dp" /> + + + + +