を使用して要素を取得し、ライブラリを使用してFlowable<List<T>>
変換してから、この最後のテーブルを観察することにより、特定のテーブル内のデータを観察しようとしています。ボタンのクリックで観測を開始する必要があります。ユーザーが初めてボタンをクリックすると、サーバーからデータがダウンロードされ、対応するテーブルに保存され、オブザーバーが設定されます。データをダウンロードしてテーブルに保存するため、ボタンをもう一度クリックすると問題が発生しますが、からメソッドは呼び出されません。LiveData
LiveDataStreams
onChanged
Observer
コードでは、他の子フラグメントがこのように実行する必要があるため、ParentFragment のonViewCreated
メソッドがshowItemsList
そこで呼び出されることがわかりますが、この現在のケースでは、ボタンの onclick の後にリストの監視を開始する必要があります。
親フラグメント:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mNavController = Navigation.findNavController(getDataBindingObject().getRoot());
showItemsList();
}
protected void showItemsList() {
mViewModel.getList().observe(getViewLifecycleOwner(), listObserver);
}
protected final Observer<List<T>> listObserver = new Observer<List<T>>() {
@Override
public void onChanged(List<T> list) {
getAct().getSupportActionBar().setTitle(getString(mViewModel.getTitleId(), list.size()));
mViewModel.setListAdapter(list);
}
};
ChildFragment (現在のケース):
@Override
protected void showItemsList() {
mDataBinding.searchButton.setOnClickListener(v -> {
mViewModel.download()
.subscribe(downloaded -> super.showItemsList()
, t -> DialogUtils.showMessage(R.string.error_binding_data));
});
}
ビューモデル:
public LiveData<List<T>> getList() {
if (list == null) {
LiveData<List<T>> lD = LiveDataReactiveStreams.fromPublisher(mRepository.getList());
list = new MediatorLiveData<>();
list.addSource(lD, l -> {
list.setValue(l);
list.remove(lD);
});
}
return list;
}
リポジトリ:
public Flowable<List<T>> getList() {
if (list == null) list = dao.getItems();
return list;
}
ダオ:
public abstract Flowable<List<MyItem>> getItems();