#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 и т. Д.)