簡體   English   中英

當片段被重新創建到前台時,Recyclerview 被重新創建

[英]Recyclerview gets recreated when fragment is recreated coming to foreground

我有一個片段,它有一個RecyclerView顯示來自觀察者的列表,該觀察者觀察來自 Room db 的列表數據的變化。 它的工作原理是這樣的 - FragmentA具有列表RecyclerView並且當用戶單擊一個項目時,它會打開(替換)另一個FragmentB這是一個列表詳細信息片段,用戶可以在其中編輯列表詳細信息項目並將其保存(在數據庫中更新), 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.
    })
}

在這篇文章中找到了這個問題的解決方案,它被寫成使用getViewLifecycleOwner()代替this ,這樣當片段視圖層次結構發生變化時,觀察者也會被取消訂閱。 現在我的問題是,如果我從FragmentB FragmentA setUpMainAdapter()將再次被調用,並且在 recyclerview 上設置了一個新適配器。 當我檢查舊的適配器實例是否仍然存在時。 如果我執行adapter.notifyItemChanged(position)它不起作用,並且 recyclerview 沒有任何可顯示的內容(因為視圖已重新創建)。 那么,將適配器設置為 recyclerview 是正確的方法嗎? 因為一次又一次地設置主適配器並且不能使用適配器的通知方法來更新項目感覺很奇怪。

使用getViewLifecycleOwner()代替它,以便在片段視圖層次結構更改時也取消訂閱觀察者。

這是根本。 當您在 RxJava 等其他框架中注冊觀察者時,您最終總是需要取消訂閱它。 使用 LiveData,生命周期所有者會為您執行此操作。 但是,當您將this用作生命周期所有者時,觀察者僅在片段被銷毀時被刪除,但在視圖被銷毀時不會被刪除,因此您最終會得到多個觀察者引用被銷毀的視圖。 這將創建 memory 泄漏。

那么,將適配器設置為 recyclerview 是正確的方法嗎?

我通常在onViewCreated中創建我的適配器,但我認為如果你確保在你的新 RecyclerView 上再次設置它,你應該可以重復使用舊適配器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM