我有一个ViewPager
,它显示10个片段。但是,当我更改FragmentPagerAdapter
并将其设置为ViewPager
时,只会更改当前未显示的片段。我尝试使ViewPager
无效,在notifyDataSetChanged()
和this SO answer and only changing the data instead of the adapter中调用FragmentPagerAdapter
(此答案使用的是PagerAdapter
而不是FragmentPagerAdapter
,但没有成功。
这就是我初始化ViewPager
viewPager = rootView.findViewById(R.id.view_pager)
changeData()
然后稍后进行更改,我将此功能称为
fun changeData(params: List<CustomObject> = ArrayList()){
viewPager.adapter = CustomCPagerAdapter(fragmentManager!!, params)
}
和CustomPagerAdapter
class CustomPagerAdapter(fm: FragmentManager,
private var customDataSet: List<CustomObject>)
: FragmentPagerAdapter(fm) {
override fun getItem(pos: Int): Fragment {
return CustomFragment.newInstance(customDataSet[pos])
}
override fun getCount(): Int {
return customDataSet.size
}
}
即使添加了新的ViewPager
,为什么FragmentPagerAdapter
仍保留显示的片段?我该如何更改?
答案 0 :(得分:0)
尝试一下:-
a=[{1,2},{2,3},{3,4},{4,5},{5,6},{6,7}]
b=[{'test'},{'test'},{'test'},{'test'}]
exclusions = [{3,4},{4,5},{5,6},{6,7}]
for index,item in enumerate(a):
if item in exclusions:
a[index] = b.pop(0)
print(a)
>>>> [{1, 2}, {2, 3}, {'test'}, {'test'}, {'test'}, {'test'}]
b_iter = iter(b)
print([item if item < 0 or item > 4 else b_iter.next() for item in a])
>>>> TypeError: '<' not supported between instances of 'set' and 'int'
答案 1 :(得分:0)
解决方案是使用FragmentStatePagerAdapter
而不是FragmentPagerAdapter
,因为它不会将碎片保留在内存中。以后的适配器进行了某种优化,即使将FragmentPagerAdapter
的新实例设置为ViewPager
,也不会强制刷新已经显示的片段。
当存在大量页面时,此版本的寻呼机更加有用,其工作方式类似于列表视图。当页面对用户不可见时,它们的整个片段可能会被破坏,仅保留该片段的保存状态。与FragmentPagerAdapter相比,这使分页器可以保留与每个访问的页面关联的更少的内存,但在页面之间进行切换时可能会产生更多开销。