/ / Xが発生したときにObservableを使用してフラグメント間でデータを渡す - java、android、rx-java

Xが発生したときにObservableでフラグメント間でデータを渡す - java、android、rx-java

私はRxJavaにかなり慣れていないので、私の問題がそれで解決できるかどうかを考えていました。

私は2つの断片で活動しています: 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);
}
}

これに取り組む方法についての任意のアイデア?

回答:

回答№1は0

この特定の状況でRxJavaを使用して何かを手に入れたかどうかはわかりません。

しかし、あなたはのようなものを使うことができます PublishSubject このコミュニケーションをするために。

header ---->投稿(件名)----> body

言い換えれば、headerは投稿を送信/送信/公開し、bodyフラグメントはそれをリッスン/監視/反応します。

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メソッドがActivity内にあり、HeaderFragment内にない場合は、問題はありません。だれでも投稿の件名に公開でき、bodyフラグメントがそれに応じて反応するためです。

そして体の破片はそれを聞くでしょう:

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