I wrote a small sample application that does what you are trying to achieve. Here are the components:
public class Datasource { public Observable<List<User>> users() { return Observable.just(Arrays.asList( new User("1", "Foo"), new User("2", "Bar") )); } public Observable<List<Pet>> pets(User user) { return Observable.just(Arrays.asList( new Pet(user.getName() + " cat"), new Pet(user.getName() + " dog") )); } }
Pet class:
public class Pet { private String mName; public Pet(String name) { mName = name; } public String getName() { return mName; } @Override public String toString() { return "Pet{" + "mName='" + mName + '\'' + '}'; } }
User Class:
public class User { private String mName; private String mId; private List<Pet> mPetList; public User(String id, String name) { this(id, name, Collections.<Pet>emptyList()); } public User(String id, String name, List<Pet> pets) { mName = name; mId = id; mPetList = pets; } public String getName() { return mName; } public String getId() { return mId; } public User copyWithPets(List<Pet> pets) { return new User(mId, mName, pets); } @Override public String toString() { return "User{" + "mName='" + mName + '\'' + ", mId='" + mId + '\'' + ", mPetList=" + mPetList + '}'; } }
Together:
datasource.users() .flatMap(new Func1<List<User>, Observable<User>>() { @Override public Observable<User> call(List<User> users) { return Observable.from(users); } }) .flatMap(new Func1<User, Observable<User>>() { @Override public Observable<User> call(final User user) { return datasource.pets(user) .map(new Func1<List<Pet>, User>() { @Override public User call(List<Pet> pets) { return user.copyWithPets(pets); } }); } }) .toList() .subscribe(new Action1<List<User>>() { @Override public void call(List<User> users) { for (User user : users) { Log.d(TAG, "user: " + user.toString()); } } });
He produces:
D/MainActivity: user: User{mName='Foo', mId='1', mPetList=[Pet{mName='Foo cat'}, Pet{mName='Foo dog'}]} D/MainActivity: user: User{mName='Bar', mId='2', mPetList=[Pet{mName='Bar cat'}, Pet{mName='Bar dog'}]}
If it does not answer your question, send the actual date-data to the user and the user.