/ / Przekazywanie danych między fragmentami z obserwowalnym, gdy X się dzieje - java, android, rx-java

Przekazywanie danych między fragmentami z obserwowalnym, gdy X się dzieje - java, android, rx-java

Jestem całkiem nowy w RxJava i zastanawiałem się, czy mój problem można rozwiązać.

Mam działanie z dwoma fragmentami: fragment nagłówka hostowany wewnątrz obiektu CollapsingToolbarLayout i fragment bryły. Fragment nagłówka ma widok recyklera z postami, a fragment bryły zawiera komentarze związane z bieżącym wpisem wyświetlanym w fragmencie nagłówka.

Teraz komentarze są ładowane natychmiast, gdywidok recyklingu wiąże post. Chciałbym jednak załadować komentarze tylko wtedy, gdy użytkownik zacznie zwijać pasek narzędzi.Mam ustawiony listener dla paska narzędzi, który zostanie wywołany, gdy użytkownik zacznie przeciągać pasek narzędzi, ale nie wiem jak hakować do fragmentu bryły za pomocą bieżącego wpisu w fragmencie nagłówka.

Aby opisać to w pseudokodzie, jest to coś takiego:

// Activity has this method invoked when toolbar starts collapsing;
// It"s invoked only once per "drag"
public void onToolbarCollapsing() {
// Somehow should pass the Post to the body fragment..?
}

// The header fragment has this method invoked when a post is bound
public void onPostBound(Post post) {
// Create an Observable<Post> and pass it to activity..?
}

// The body fragment could probably observe the observable?

W tej chwili mam Activity zaimplementować ActivityCallback:

public interface ActivityCallback {
void loadCommentsFor(Post post);
}

public class MainActivity extends AppCompatActivity implements ActivityCallback {

@Override void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Create fragments, set activity callback to the header fragment
HeaderFragment header = new HeaderFragment();
header.setActivityCallback(this);

BodyFragment body = new BodyFragment();

// Set fragments to the view etc.
}

// Implementation
@Override
public void loadCommentsFor(Post post) {
// Just pass the post object to the body fragment
bodyFragment.loadCommentsFor(post);
}
}

Wszelkie pomysły, jak rozwiązać ten problem?

Odpowiedzi:

0 dla odpowiedzi № 1

Nie jestem pewien, że jeśli w tej konkretnej sytuacji uzyskasz coś za pomocą RxJava.

Ale możesz użyć czegoś takiego PublishSubject aby wykonać tę komunikację.

nagłówek ----> Wpisy (temat) ----> treść

Innymi słowy, nagłówek emituje / wysyła / publikuje posty, a fragment ciała słucha / obserwuje / reaguje na nie.

public class MainActivity extends AppCompatActivity implements ActivityCallback {

@Override void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

PublishSubject<Post> posts = PublishSubject.create()

HeaderFragment header = new HeaderFragment(posts);
BodyFragment body = new BodyFragment(posts);

// Set fragments to the view etc.
}

}

HeaderFragment powinien emitować posty:

private final PublishSubject<Post> posts;

public HeaderFragment(PublishSubject<Post> posts) {
this.posts = posts;
}

public void onToolbarCollapsing() {
this.posts.onNext(theCurrentPost);
}

Jeśli metoda onToolbarCollapsing znajduje się w działaniu, a nie w HeaderFragment, nie ma problemu, ponieważ każdy może opublikować obiekt posta, a fragment ciała będzie odpowiednio reagował.

I fragment ciała będzie go słuchał:

private final PublishSubject<Post> posts;

public BodyFragment(PublishSubject<Post> posts) {
this.posts = posts;
}

//Do something with the post
//this.posts.subscribe(new Observer<Posts>())
//Such as fetchComments
this.posts.flatMap(new Function<Post, SingleSource<List<Comment>>() {
@Override
public SingleSource<List<Comment>>apply(Post post) throws Exception {
//Should return a Single<List<Comment>>
return fetchComments(post);
}
})
.subscribe(new SingleObserver<List<Comment>>() {
void onSuccess(List<Comment> comments) {
//update the adapter
}
});

OBS:

Podałem temat konstruktorom dla uproszczenia. Możesz użyć onAttach () lub onCreateView () do @Inject ich (Dagger2, Guice, itp)