更换ViewPager适配器仅更改屏幕外的片段

时间:2018-07-30 18:45:14

标签: android kotlin android-viewpager

我有一个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仍保留显示的片段?我该如何更改?

2 个答案:

答案 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,也不会强制刷新已经显示的片段。

来自有关FragmentStatePagerAdapter

的文档
  

当存在大量页面时,此版本的寻呼机更加有用,其工作方式类似于列表视图。当页面对用户不可见时,它们的整个片段可能会被破坏,仅保留该片段的保存状态。与FragmentPagerAdapter相比,这使分页器可以保留与每个访问的页面关联的更少的内存,但在页面之间进行切换时可能会产生更多开销。