2016-10-04 36 views
1

我對RxJava相當陌生,我在想如果我的問題可以用它解決。當X發生時,通過Observable在片段之間傳遞數據

我有一個有兩個片段的活動:一個在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這樣的通信。

頭---->帖子(主題)---->體

換句話說,報頭髮射/發送/發佈帖子,並且主體片段偵聽/觀察/反應以它。

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等)

相關問題