Прежде всего:
Для того, чтобы в вашем ордере Order был объект OrderDetailsJSON
public class Order {
...
OrderDetailsJSON orderDetailsJson;
public void setOrderDetailsJson(OrderDetailsJSON orderDetailsJson) {
this.orderDetailsJson = orderDetailsJson;
}
public OrderDetailsJSON getOrderDetailsJson(){
return this.orderDetailsJson
}
}
Используется оператор replay
replay ()заставить Observable выдавать данные о новых подписках без повторного выполнения логики, т.е. без повторного вызова API (getOrders (). replay ()).Поскольку вы используете ConnectableObservable, внесите следующие изменения в свою реализацию, чтобы добиться желаемого ...
Замените это
// Fetching individual orderInfo
disposable.add(ordersObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Function<List<Order>, ObservableSource<Order>>()
{
@Override
public ObservableSource<Order> apply(List<Order> orders)
{
return Observable.fromIterable(orders);
}
})
);
на
/**
* Fetching individual order details
* First FlatMap converts single List<Order> from RecentOrdersJSON to multiple emissions of orders
* Second FlatMap makes HTTP call on each Order emission to fetch the details
* */
disposable.add(
ordersObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
/**
* Converting List<Order> emission to single Order emissions
* */
.flatMap(new Function<RecentOrdersJSON, ObservableSource<Order>>() {
@Override
public ObservableSource<Order> apply(RecentOrdersJSON recentOrderJson)
{
return Observable.fromIterable(recentOrdersJSON.getOrders());
}
})
/**
* Fetching details on each order emission
* */
.flatMap(new Function<Order, ObservableSource<Order>>() {
@Override
public ObservableSource<Order> apply(Order order) throws Exception {
return getOrderDetailsObservable(order);
}
})
.subscribeWith(new DisposableObserver<Order>() {
@Override
public void onNext(Order order) {
int position = orderList.indexOf(order);
if (position == -1) {
// Order not found in the list
// This shouldn't happen
return;
}
orderList.set(position, order);
orderlistAdapter.notifyItemChanged(position);
}
@Override
public void onError(Throwable e) {
//show error
}
@Override
public void onComplete() {
}
}));
Также замените это
private Observable<OrderDetailsJSON> getOrderObservable(final String Order_ID)
{
return ServiceAPI.orderDetails(Order_ID)
.toObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
на
private Observable<Order> getOrderDetailsObservable(final Order order) {
return ServiceAPI
.orderDetails(order.getOrder_id())
.toObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(new Function<OrderDetailsJSON, Order>() {
@Override
public Order apply(OrderDetailsJSON orderDetailsJSON) throws Exception {
order.setOrderDetailsJson(orderDetailsJSON);
return order;
}
});
}