使用 ViewModel 和 NavigationComponents 在 onViewCreated() 中仅设置一次适配器

Set adapters only once at onViewCreated() with ViewModel and NavigationComponents

我一直在阅读 viewmodel-savedstate,我的用例如下,我膨胀一个 recyclerview 并用数据填充它,我正在使用 ConcatAdapter 并且因为我需要构建我的视图以便我初始化我的 onViewCreated 中的适配器,这在启动时工作正常,但如果我从 FragmentA 转到 FragmentB 然后回来,它将再次传递给 onViewCreated() 因此它将重新创建我的适配器,用重复的项目重新填充 recyclerview,是吗一种只设置这些适配器一次的方法? savedStateHandle 是一个好方法吗?

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val firstAdapter = FirstAdapter(listOfData)
        val secondAdapter = SecondAdapter(listOfData)
        val thirdAdapter = ThirdAdapter(listOfData)

        concatAdapter.addAdapter(firstAdapter)
        concatAdapter.addAdapter(secondAdapter)
        concatAdapter.addAdapter(thirdAdapter)
    }

所以发生的事情是,我在 FragmentA 中膨胀它,没关系,当我从 Fragment A 转到 Fragment B 并返回时,这将被重新创建并复制到我的 recyclerview

我尝试使用 concatAdapter.getAdapters().clear() 但我无法在设置之前清除列表,因为它是 unmodifiableList

如何只在我的 Fragment 上进行一次此设置,或者每次返回时都从头开始重新创建它?

每次调用 onViewCreated() 时,您都需要为新的 RecyclerView 实例创建一个新的 ConcatAdapter 实例。

之前的 RecyclerView 应该在调用 onDestroyView() 时被销毁,您还必须在同一点删除对适配器的任何引用以避免内存泄漏(适配器持有硬引用它的 RecyclerView。您不能在 onCreate() 中只创建一个实例并一遍又一遍地重复使用它。

通过创建一个新的 ConcatAdapter 实例,您可以确保 addAdapter 只为您的第一个、第二个和第三个子适配器调用一次。