我的问题是适配器订阅多个可观察对象的最佳方式是什么
我有一个具有标题和常规项目类型的适配器。适配器的信息来自使用 Sqlbrite 的数据库。使用 Sqlbrite,我想通过让适配器订阅 observable 来更新标题和列表。
对于第一个 Observable 来说不是问题。在我的片段的 OnResume 中:
mSubscription = TrackerDbUtils.getListSubmissionObservable(db)
.map(Submission.MAP)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mAdapter);
但是,然后我尝试向片段添加第二个 Observable
mHeaderSubscription = TrackerDbUtils.getSummaryObservable(db)
.map(Summary.MAP)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mAdapter);
所以,我需要在我的适配器中实现 Action1:
public class MileageTrackerAdapter extends HeaderRecyclerViewAdapter
implements Action1<List<Submission>>, Action1<Summary> {
.
.
.
}
但是,我得到一个重复的类错误。所以我尝试实现一个泛型类型:
public class MileageTrackerAdapter extends HeaderRecyclerViewAdapter
implements Action1<Object> {
.
.
.
@Override
public void call(Object o) {
if(o instanceof Summary){
// Logic
} else {
// Logic
}
}
}
但是我收到一个运行时错误,我无法将摘要映射到提交。即便如此,我也不确定铸造泛型是解决问题的最佳方法。
根据 dwursteisen 的反馈:
我将 Summary 类更改为映射到 Submission。我还创建了一个名为“isSummary”的新字段。我按照建议将我的 observable 更改为以下内容:
TrackerDbUtils.getListSubmissionObservable(db)
.map(Submission.MAP)
.mergeWith(TrackerDbUtils.getSummaryObservable(db)
.map(Summary.MAP))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mAdapter);
这会创建一个 Observable,它会触发两次;一个是批量提交列表,另一个是大小为 1 的列表。这个列表实际上是摘要。在我的适配器中:
@Override
public void call(List<Submission> mSubmissions) {
if(mSubmissions.size() == 1 && mSubmissions.get(0).isSummary()){
mSummary = mSubmissions.get(0);
} else {
mArray = new ArrayList<>(mSubmissions);
}
notifyDataSetChanged();
}