diff --git a/app/src/main/java/com/gamedog/vididin/main/fragments/HomeFragment.kt b/app/src/main/java/com/gamedog/vididin/main/fragments/HomeFragment.kt index d55765b..c75b67d 100644 --- a/app/src/main/java/com/gamedog/vididin/main/fragments/HomeFragment.kt +++ b/app/src/main/java/com/gamedog/vididin/main/fragments/HomeFragment.kt @@ -33,6 +33,7 @@ class HomeFragment : AppViewsFragment(), OnSwit + //private val mViewPagerAdapter by lazy { HomeFragmentStateAdapter(this) } private val mViewPagerAdapter by lazy { HomeFragmentStateAdapter(this) } override fun inflateViewBinding( diff --git a/app/src/main/java/com/gamedog/vididin/main/fragments/home/HomeVpLoopAdapter.kt b/app/src/main/java/com/gamedog/vididin/main/fragments/home/HomeVpLoopAdapter.kt new file mode 100644 index 0000000..63005b6 --- /dev/null +++ b/app/src/main/java/com/gamedog/vididin/main/fragments/home/HomeVpLoopAdapter.kt @@ -0,0 +1,28 @@ +package com.gamedog.vididin.main.fragments.home + + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.viewpager2.adapter.FragmentStateAdapter + + +class HomeVpLoopAdapter( + private val activity: FragmentActivity, + private val dataList: List, + private val fragmentCreatorFun: (List, Int) -> Fragment +) : FragmentStateAdapter(activity) { + + companion object { + private const val LOOP_FRAGMENT_COUNT = 3 + } + + private val mRealPageCount = LOOP_FRAGMENT_COUNT + + override fun getItemCount(): Int = Int.MAX_VALUE + + override fun createFragment(position: Int): Fragment { + val fragmentPosition = position % mRealPageCount + return fragmentCreatorFun(dataList, fragmentPosition) + } + +} diff --git a/app/src/main/java/com/gamedog/vididin/widget/loopViewpager/LoopPagerAdapter.kt b/app/src/main/java/com/gamedog/vididin/widget/loopViewpager/LoopPagerAdapter.kt index a1d6a82..0c14753 100644 --- a/app/src/main/java/com/gamedog/vididin/widget/loopViewpager/LoopPagerAdapter.kt +++ b/app/src/main/java/com/gamedog/vididin/widget/loopViewpager/LoopPagerAdapter.kt @@ -7,7 +7,7 @@ import androidx.viewpager2.adapter.FragmentStateAdapter class LoopPagerAdapter( private val activity: FragmentActivity, private val dataList: List, - private val fragmentCreatorFun: (List, Int) -> Fragment // 修改点1:传入整个数据列表和真实位置, 接收一个创建Fragment的lambda,传入数据和在ViewPager中的真实位置 + private val fragmentCreatorFun: (List, Int) -> Fragment ) : FragmentStateAdapter(activity) { private val mRealPageCount = 3 diff --git a/core/architecture/src/main/java/com/ama/core/architecture/base/views/adapter/BaseFragmentStateAdapter.kt b/core/architecture/src/main/java/com/ama/core/architecture/base/views/adapter/BaseFragmentStateAdapter.kt index 90d70a9..ee7e1c0 100644 --- a/core/architecture/src/main/java/com/ama/core/architecture/base/views/adapter/BaseFragmentStateAdapter.kt +++ b/core/architecture/src/main/java/com/ama/core/architecture/base/views/adapter/BaseFragmentStateAdapter.kt @@ -38,16 +38,13 @@ abstract class BaseFragmentStateAdapter( override fun createFragment(position: Int): Fragment { return createFragment(position, getItem(position)) - // 设置Fragment是否是懒加载初始化 .setFragmentIsLazyInit(isFragmentLazyInit) } - // 返回对应位置的,数据项的唯一ID。 override fun getItemId(position: Int): Long { return getItem(position).getItemId() } - // 判断给定的itemId,是否在当前数据集中。 override fun containsItem(itemId: Long): Boolean { return getCurrentList().any { it.getItemId() == itemId } } @@ -58,7 +55,6 @@ abstract class BaseFragmentStateAdapter( mDiffer.submitList(list) } - // 文章:https://blog.csdn.net/cxz200367/article/details/115032032 fun getFragmentByIndex(position: Int) = if (position in 0.. ViewPager2.setDataOrAdapter( - list: List?, + dataList: List?, offscreenPageLimit: Int?, createAdapter: () -> BaseFragmentStateAdapter, ) { - // 设置预加载 setOffscreenPageLimit( if (offscreenPageLimit == null || offscreenPageLimit <= 0) { // 小值,用默认的。 ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT } else if (offscreenPageLimit == Int.MAX_VALUE) { // 大值,用全部的。 - val itemCount = (list?.size ?: 0) + val itemCount = (dataList?.size ?: 0) if (itemCount >= 2) { // 2个及以上 itemCount - 1 @@ -41,14 +35,13 @@ fun ViewPager2.setDataOrAdapter( ) if (adapter == null) { - // create adapter - if (list.isNullOrEmpty()) return // 初始化状态,不设置下面的,防止没恢复之前保持的数据。不能使用adapter.setStateRestorationPolicy(PREVENT_WHEN_EMPTY)来替代实现,因为此ViewPager2是通过setAdapter进行恢复的。 + if (dataList.isNullOrEmpty()) return val fragmentStateAdapter = createAdapter() - fragmentStateAdapter.submitList(list) - // set adapter + fragmentStateAdapter.submitList(dataList) + adapter = fragmentStateAdapter } else { // update adapter - adapter.asUnsafe>().submitList(list) + adapter.asUnsafe>().submitList(dataList) } } \ No newline at end of file