Передача данных между фрагментами с наблюдаемым, когда происходит X

#java #android #rx-java

#java #Android #rx-java

Вопрос:

Я довольно новичок в RxJava, и я подумал, можно ли с его помощью решить мою проблему.

У меня есть действие с двумя фрагментами: фрагмент заголовка, размещенный внутри CollapsingToolbarLayout, и фрагмент тела. Фрагмент заголовка имеет представление recycler с сообщениями, а фрагмент тела показывает комментарии, связанные с текущим сообщением, показанным во фрагменте заголовка.

Теперь комментарии загружаются немедленно, когда представление recycler привязывает сообщение. Однако я хотел бы загружать комментарии только тогда, когда пользователь начинает сворачивать панель инструментов. У меня есть прослушиватель, настроенный для панели инструментов, который вызывается, когда пользователь начинает перетаскивать панель инструментов вверх, но я действительно не знаю, как подключить его к фрагменту тела, используя текущую запись во фрагменте заголовка.

Чтобы описать это в псевдокоде, это что-то вроде этого:

 // 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?
  

На данный момент у меня есть Activity реализация 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);
    }
}
  

Есть идеи о том, как с этим справиться?

Ответ №1:

Я не уверен, что если в этой конкретной ситуации вы что-то получите, используя RxJava.

Но вы могли бы использовать что-то вроде PublishSubject для выполнения этой связи.

заголовок —-> Сообщения (тема) —-> тело

Другими словами, заголовок отправляет / отправляет / публикует сообщения, а фрагмент тела слушает / наблюдает / реагирует на него.

 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.
   }

}
  

Фрагмент заголовка должен выдавать сообщения:

 private final PublishSubject<Post> posts;

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

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

Если метод onToolbarCollapsing находится в Activity, а не в HeaderFragment, проблем нет, поскольку любой может опубликовать в теме сообщения, и фрагмент тела отреагирует соответствующим образом.

И фрагмент тела будет прослушивать его:

 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:

Я передал тему конструкторам для простоты. Вы могли бы использовать onAttach() или onCreateView(), Чтобы @вводить их (Dagger2, Guice и т. Д.)