2017-10-30 3 views
1

RxJavaが新しく、フローのカスタマイズに問題があります。ユースケースはこちらです:監視可能なアイテムによって特定の量のアイテムがエミュレートされた後でアクションをトリガーする

The View

私は画像のグリッドや画像の合計金額が表示されますTextViewとフッターを表示するGridLayoutManagerRecyclerViewを持っています。文脈に入れるために、私はユーザが15枚の画像を持つことができます。TextViewは「15枚の画像」と言いますが、グリッドは4枚しか表示されません(「プレビュー」と理解してください)。さて、私が作成したObservableのonComplete()に、これらの画像を表示するために、私はadapter.notifyDatasetChanged()と呼ぶでしょう。しかし、その画像が表示されるのを待つことは無意味です。リストがあれば、200枚の画像が表示されます。リストから4枚の画像が出力されるとすぐにアダプターに通知したいと思います。私の観察できるが、そのように作成されます。

Observable.just(user.getUserId()) 
      .subscribeOn(Schedulers.io()) 
      .map(this::getImageList) 
      .flatMap(images -> Observable.fromIterable(images) 
       .map(image -> image)) 
      .observeOn(AndroidSchedulers.mainThread()); 

はそうした、その後、 images.size == 200あれば、それは(私はここでは正しいよ願っています)200回通知されますので、私は、 Observer.onNext()にアダプタを通知することはできません。 Observer.onComplete()でそれを行うことはできません。アダプタが通知される前に、200の模範的な画像のすべてが放出されるのを待つので、私はそれを行うこともできません。リストから4つのアイテムが放出されたときにそのフローを傍受し、(アダプタに通知する)どのようにして残りを放出し続けることができますか?4つだけで完了せずに、総イメージ量で適切なフッターテキストを表示できますイメージ?

UPDATE - この質問の範囲外の目的のために、私は観察可能な完了後に画像の完全なリストが必要です。私はそれらのうちの4つを表示し、TextViewを検索された画像の総量で更新し、検索された全画像のリストを保存したい。

答えて

2

flatMapのコードを変更しても、画像リストにアクセスしてサイズを取得できます。

Observable.just(user.getUserId()) 
     .subscribeOn(Schedulers.io()) 
     .map(this::getImageList) 
     .flatMap(images -> { 
       // you can access images size here, update footer 
       footer.setText(images.size() + " images"); 
       // pass full list of images to your view, i.e like this 
       view.setImages(images); 
       return Observable.fromIterable(images) 
      }) 
      .take(4) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(image -> { 
           // add image to grid 
           }, 
         error -> { 
           // handle error 
           } 
         () -> { 
           // four images were emitted, emission complete 
           adapter.notifyDatasetChanged(); 
           }); 
+0

ご回答ありがとうございます。私は私の質問を変更する必要があります - 私はこの問題の範囲外の、さらなる処理のために画像のリストが必要です。フッターのテキストは、私が完全なリストが必要な理由の例でしたが、非常に弱い例があります。実際には、まだ完全な画像リストが必要です。 – Austie

+0

サイズを取得したり、リストをアダプターに渡したり、200枚の画像を送信する必要があるなど、全体としてアクションを実行する必要がありますか?最初のケースでは、あなたはまだあなたのリストにアクセスすることができますコードのブロックを変更することができます(最初のコメントの下)。 2番目のケースでは、私は自分の答えを – canihazurcode

+0

で更新しますので、このように見えます。私はユーザープロファイルを表示する画面を持っています。 'userId'に基づいて、ユーザーの画像リストを取得します。しかし、ユーザープロファイルのすべてを詰め込むのではなく、そのうちの4つだけを表示し、ユーザーが持つ画像の数を示すテキストをフッターで表示します。フッターをクリックすると、すべての画像のリストを表示する新しい画面が開きます。これは、私がそれを表示する新しい画面に渡すために、画像の完全なリストを必要としているが、 "メイン画面"に4つしか表示しない理由です。それは状況をより良く説明していますか? – Austie

関連する問題