2016-10-04 3 views
1

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

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

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

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

// 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); 
    } 
} 

Любые идеи о том, как решить эту ?

ответ

0

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

Но вы можете использовать что-то вроде PublishSubject, чтобы сделать это сообщение.

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

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

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 должен излучать сообщения:

private final PublishSubject<Post> posts; 

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

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

Если метод onToolbarCollapsing находится в деятельности, а не в 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() для @Inject их (Dagger2, Guice и т. Д.)

Смежные вопросы