我需要以动态更新ViewPager 2中显示的片段的方式设置ViewPager 2。
为了便于实现这一点,我创建了一个视图模型LiveData对象,其中包含一个项目列表,这些项目表示片段应该显示的数据:
val items: LiveData<List<Item>>
在我的包含ViewPager 2的片段中,在onViewCreated中,我设置观察项:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.items.observe(viewLifecycleOwner) { items ->
binding.viewPager.adapter = createFragmentStateAdapter(items)
}
}
这一切都运行良好,除了当我打开“不保留活动”进行测试时。当我在后台/前台运行应用时,我看到包含ViewPager 2的片段被重新创建,而且items observable正在广播更新。但是,由于某种原因,ViewPager 2显示了一个旧的片段,似乎忽略了items observe块中创建的新适配器。
如何在适配器更改时正确更新ViewPager 2?
我认为可能发生的情况是ViewPager 2正在尝试恢复其自身的状态,但在此过程中忽略了要使用的适配器的最近更改。
2条答案
按热度按时间vfwfrxfs1#
Adapter创建不能放在observe中,因为每次更新数据都会创建一个Adapter,在viewCreated中创建Adapter,Adapter中有数据添加和UI更新操作。
第一个
dced5bon2#
我找到了一个解决方案,方法是在使用的
FragmentStateAdapter
中重写getItemId
和containsItem