2

標準のAndroidフラグメントをLiveDataとともに使用しようとしています。 更新は、ルームデータベースの更新によってトリガーされます。 残念ながら、私の観察者は誘発されません。標準フラグメントが使用されている場合、LiveDataはLifecycleRegistryOwnerを呼び出さない

例コード:

public class MyListFragment extends Fragment implements LifecycleRegistryOwner { 

LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); 

@Override 
public LifecycleRegistry getLifecycle() { 
    return mLifecycleRegistry; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

// ... normal code 

    AppDatabase database = AppDatabase.getDatabase(getContext()); 
    LiveData<List<RssItem>> allRssItems = database.rssItemDao().getAllRssItems(); 
    allRssItems.observe(this, rssItems -> setListContent(rssItems)); 

}

Iは、ライフサイクル・イベントを無視するように強制する場合、私が更新を受け取ります。

allRssItems.observeForever(new Observer<List<RssItem>>() { 
     @Override 
     public void onChanged(@Nullable List<RssItem> rssItems) { 
      Toast.makeText(getContext(), "Update", Toast.LENGTH_SHORT).show(); 
      setListContent(rssItems); 
     } 
    }); 

誰かが私のエラーを発見できますか? v4.FragmentではなくAndroidの標準的なものを使用していますが、LifecycleFragmentの実装を自分のコードにコピーしたときに、これが機能するはずです。

+2

おそらく[この問題]のバリエーション(https://issuetracker.google.com/issues/62160522)です。 – CommonsWare

+0

ありがとう、マーク、それは確かに問題です。 https://issuetracker.google.com/issues/62160522#comment1に記載されている回避策を使用すると解決します。 – vogella

答えて

3

CommonsWareからのコメントとバグへのリンクがこの問題を解決します。標準フラグメントの場合、対応するライフサイクルイベント、たとえばlifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE)をトリガーする必要があります。

関連する問題