Android viewpager2 懒加载且不清除缓存

329 阅读1分钟

需求背景

viewpager2需要懒加载,初始化时候只初始化第一个页面,不额外加载别的页面,切换多个其他页面后,之前的页面能够缓存起来,不被回收导致重新初始化。

实现方法

  1. 给viewpager自定义adapter
  2. 设置viewpager内的recyclerview

以下是具体代码


class MatchPagerAdapter(fragmentActivity: Fragment) :
    FragmentStateAdapter(fragmentActivity) {

    var list: List<String> = ArrayList()
        private set
    var fragments: List<BaseFragment> = ArrayList()
        private set

    private var listIds: List<Long>? = null

    @SuppressLint("NotifyDataSetChanged")
    fun setData(list: List<String>, fragments: List<BaseFragment>) {
        this.list = list
        this.fragments = fragments
        this.listIds = list.map { it.hashCode().toLong() }
        notifyDataSetChanged()
    }

    override fun getItemId(position: Int): Long {
        return this.list[position].hashCode().toLong()
    }

    override fun containsItem(itemId: Long): Boolean {
        return listIds?.contains(itemId) ?: return false
    }

    override fun getItemCount(): Int {
        return list.size
    }

    override fun createFragment(position: Int): Fragment {
        return if (fragments.isNotEmpty() || fragments.size > position) fragments[position] else Fragment()
    }
}

viewpager的设置

fragmentStateAdapter = new MatchPagerAdapter(this);
viewPager.setAdapter(fragmentStateAdapter);
fragmentStateAdapter.setData(gameTypes,mFragments);
RecyclerView recyclerView = (RecyclerView) viewPager.getChildAt(0);
recyclerView.setItemViewCacheSize(fragmentStateAdapter.getItemCount());