2016-10-04 4 views
1

私はRxJavaをかなり新しくしています。問題が解決できれば私は考えていました。Xが発生したときObservableでフラグメント間でデータを渡す

私は、CollapsingToolbarLayout内にホストされているヘッダーフラグメントとボディーフラグメントの2つのフラグメントでアクティビティーを持っています。ヘッダーフラグメントには、投稿を含むリサイクラービューがあり、本文フラグメントには、ヘッダーフラグメントに表示されている現在の投稿に関連するコメントが表示されます。

リサイクラビューが投稿をバインドするとすぐにコメントが読み込まれます。しかし、ユーザーがツールバーの折り畳みを開始するときにのみ、コメントをロードしたいと思います。ユーザーがツールバーのドラッグを開始したときに呼び出されるツールバー用のリスナーが設定されていますが、ヘッダーフラグメント内の現在のポストを使用して本体のフラグメントに接続する方法はわかりません。擬似コードでそれを記述するために

が、それはこのようなものです:現時点では

// 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のようなものを使用できます。

ヘッダは---->投稿(被写体)---->本体すなわち

、ヘッダが出射する/ポストをパブリッシュ/送信し、本体断片をリッスン/観察/それに反応します。

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など)

関連する問題