Android常见问题
JasonDev324

ViewPager2

  • 如何解决动态增减Fragment的问题?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class BaseVPAdapter(manager: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(manager, lifecycle) {
var fragments = ArrayList<Fragment>()
var ids = arrayListOf<Long>()

fun add(f: Fragment) {
fragments.add(f)
ids.add(f.hashCode().toLong())
notifyDataSetChanged()
}

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

override fun createFragment(position: Int): Fragment {
return fragments[position]
}

/**
* 重写以下两个方法解决动态刷新的问题
*/
override fun getItemId(position: Int): Long {
return ids[position]
}

override fun containsItem(itemId: Long): Boolean {
return ids.contains(itemId)
}
}

ViewPager2 默认是懒加载的,因此Fragment只需在OnResume里请求数据即可。为避免频繁创建销毁Fragment,可设置offscreenPageLimit = categoryList.size,即一开始就创建Fragment。但不请求数据。

1
binding.viewPager.offscreenPageLimit = categoryList.size

ConcatAdapter

  • concatAdapter使用时要将setIsolateViewTypes 设置为false,共用缓存
  • 何时用false?子Adapter相同时,比如concatAdapter 有1、2、1三个子,此时需要设置为false
  • true为不使用缓存,如果有相同的子Adapter (itemType相同)设置true会报错
Powered by Hexo & Theme Keep
Total words 22k Unique Visitor Page View