在Viewpager中使用具有相同ViewModel的相同Fragment的多个实例时出现问题

时间:2018-09-06 15:41:35

标签: android android-fragments android-viewpager android-architecture-components android-viewmodel

我有一个带有视图模型(VM1)的片段(FRAG1)。我正在FragmentPagerAdapter中创建此片段的两个新实例,以加载到ViewPager中。

Viewpager位于父片段中。

两个片段实例中的ViewModels似乎都不是唯一的。这两个片段实例似乎都具有在最后初始化的第二个片段中创建的ViewModel实例的属性。

private inner class ItDeclarationFragAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm)
{
    override fun getItem(position: Int): Fragment
    {
        return when (position)
        {
            0 -> ITDeclarationSummaryFragment.newInstance(false)
            1 -> ITDeclarationSummaryFragment.newInstance(true)

            else -> ITDeclarationSummaryFragment.newInstance(false)
        }
    }

    override fun getCount(): Int
    {
        return 2
    }

    override fun getPageTitle(position: Int): CharSequence?
    {
        return when (position)
        {
            0 -> resources.getString(R.string.zpl_itDeclaration_tile)
            1 -> resources.getString(R.string.zpl_itDeclaration_poi_title)

            else -> resources.getString(R.string.zpl_reimbursements_summary)
        }
    }
}

该片段创建了一个新对象,它在OnCreate()中创建了ViewModel的一个实例

override fun onCreate(savedInstanceState: Bundle?)
{
    super.onCreate(savedInstanceState)

    vm = ViewModelProvider.AndroidViewModelFactory.getInstance(activity!!.application).create(ITDeclarationSummaryViewModel::class.java)
    vm.setRepository(getRepo())
    vm.mIsPOI = arguments!![StringConstants.isPOI]!! as Boolean
}

稍后将其设置为OnCreateView()上的绑定

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?
{
    mView = inflater.inflate(R.layout.declaration_summary_fragment, container, false)

    mBinding       = DeclarationSummaryFragmentBinding.bind(mView!!)
    mBinding.model = vm
    mBinding.setLifecycleOwner(this)

    return mBinding.root
}

但是两个片段中的视图模型似乎都保留了第二个片段的值。它们似乎并不分离且独特。

例如,

视图模型中有一个布尔值,在第一个ViewModel中为FALSE,在第二个ViewModel中为TRUE。但是,一旦创建了第二个虚拟机,两个片段视图模型都将为TRUE。

类似地,第一个ViewModel中LiveData的观察者不起作用。

请帮助我解决此问题。预先感谢。

2 个答案:

答案 0 :(得分:2)

问题是,您正在使用AndroidViewModelFactory创建ViewModel,如果您在所有片段中都使用相同的视图模型,则该视图模型将为所有非视图模型保留相同的实例。也许考虑通过调用创建视图模型:

ViewModelProviders.of(fragment).get(ViewModel.class)

这将始终为您提供每个片段的新视图模型实例。或者,如果您想吸引相同的活动,只需传递而不是分段活动即可。

答案 1 :(得分:0)

问题不是由于片段或视图模型。

视图模型包含一个实例或一个Repository类。我错误地为两个ViewModel提供了相同的Repository类实例。

这导致数据在ViewModel之间持久存在。