当片段重新创建到前台时,将重新创建Recyclerview

问题描述 投票:1回答:1

我有一个片段,其中有一个RecyclerView,它显示来自观察者的列表,该观察者观察Room db中列表数据的变化。它的工作原理如下-FragmentA具有列表RecyclerView,并且当用户单击某个项目时,它会打开(替换)另一个FragmentB,这是一个列表详细信息片段,用户可以在其中编辑列表详细信息并将其保存(更新为db),然后LiveData将完成该工作并更新列表。但是,当我按下后退按钮时,将重新创建FragmentA的视图,并订阅了另一个相同的观察者,如下面的代码所示-

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    setupUI(view);

    viewModel.getInspections().observe(this, inspectionsList -> {
        setUpMainAdapter(inspectionsList); //setting Recyclerview adapter on recyclerview.
    })
}

我找到了解决此问题的方法in this article,在该问题中,它写为使用getViewLifecycleOwner()而不是this,以便在更改片段视图层次结构时也取消订阅观察者。现在的问题是,如果我从FragmentA回到FragmentB,则再次调用setUpMainAdapter(),并且在recyclerview上设置了新适配器。当我检查旧的适配器实例仍然存在时。如果我执行adapter.notifyItemChanged(position),它将不起作用,并且recyclerview无法显示任何内容(因为重新创建了视图)。那么,在这里设置适配器到recyclerview是正确的方法吗?因为一次又一次地设置主适配器而不能使用适配器的notify方法只是更新一个项目,这很奇怪。

android android-fragments android-recyclerview android-livedata observer-pattern
1个回答
0
投票

使用getViewLifecycleOwner()代替此,以便在更改片段视图层次结构时也取消订阅观察者。

这是基本的。当您在RxJava之类的其他框架中注册观察者时,最终总是需要取消订阅。使用LiveData,生命周期所有者可以为您完成此任务。但是,当您使用this作为生命周期所有者时,只有在破坏片段时才删除观察者,而在破坏视图时则不会移除观察者!因此,最终会有多个观察者引用被破坏的视图,这将导致内存泄漏。

所以,在这里为recyclerview设置适配器是正确的方法吗?

我通常在onViewCreated中创建我的适配器,但是如果您确保在新的RecyclerView上再次设置它,我认为可以很好地重用旧的适配器。

© www.soinside.com 2019 - 2024. All rights reserved.