需求背景
viewpager2需要懒加载,初始化时候只初始化第一个页面,不额外加载别的页面,切换多个其他页面后,之前的页面能够缓存起来,不被回收导致重新初始化。
实现方法
- 给viewpager自定义adapter
- 设置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());