0

を使用して要素を取得し、ライブラリを使用してFlowable<List<T>>変換してから、この最後のテーブルを観察することにより、特定のテーブル内のデータを観察しようとしています。ボタンのクリックで観測を開始する必要があります。ユーザーが初めてボタンをクリックすると、サーバーからデータがダウンロードされ、対応するテーブルに保存され、オブザーバーが設定されます。データをダウンロードしてテーブルに保存するため、ボタンをもう一度クリックすると問題が発生しますが、からメソッドは呼び出されませんLiveDataLiveDataStreamsonChangedObserver

コードでは、他の子フラグメントがこのように実行する必要があるため、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();
4

1 に答える 1