0

フラグメントにRecyclerViewがあり、アイテムクリックがthis SO answerで説明されているようにRxJava2を使用して処理されています。RecyclerViewアイテムクリックでRxJava2 + RxBindingがフラグメント置換後に機能しない

private PublishSubject<Place> itemViewClickSubject = PublishSubject.create(); 

@Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_result_view, parent, false); 

     ViewHolder viewHolder = new ViewHolder(view); 

     // convert click events into reactive stream 
     RxView.clicks(view) 
       .takeUntil(RxView.detaches(parent)) 
       // viewHolder.getPlace() is null until it get bound 
       .map(__ -> viewHolder.getPlace()) 
       .subscribe(itemViewClickSubject); 

     return viewHolder; 
    } 

フラグメント内のRecyclerViewは、1回だけ正常に動作します。アイテム上のクリックフラグメントは別のフラグメントで置き換えられます。バックプレス後、RecyclerViewフラグメントは表示されますが、クリックはもはや機能しません。

.takeUntil(RxView.detaches(parent))行を削除すると機能します。 RecyclerViewが表示されていないとき(Detached)、RxViewクリックの強いバインディングを解除する必要があると思います。どうすれば問題を解決できますか?私はアタッチ/デタッチイベントのいずれかを使用して問題を解決しようとしています、どんな提案も素晴らしいでしょう!ありがとう。

private PublishSubject<Place> itemViewClickSubject = PublishSubject.create(); 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int position) { 
    RxView.clicks(viewHolder.itemView) //viewHolder.itemView here You have access to view 
      .map(aVoid -> viewHolder.getPlace()) 
      .subscribe(itemViewClickSubject); 
} 

@Override 
public void onDetachedFromRecyclerView(RecyclerView recyclerView) { 
    itemViewClickSubject.onCompleted(); //here we avoid memory leaks 
} 
+1

セットアップの提案のために、それは素晴らしい作品onBindViewHolder – Wrobel

+0

@Wrobelのおかげでクリックする必要があります –

+0

メモリリークを避けるためにtakeUntil()が必要なため – Wrobel

答えて

2

は私がRecylerView + RxJavaのための私のソリューション全体を送り、あなたの質問やコメントに答えるために。それでも `.takeUntil(RxView.detaches(parent))`部分の使用について混乱します。元のSOの答えでそれを使用する理由は何でしょうか。今は私はそれがいかなる退会もしないので、最初の部分のその部分が意味をなさないことを考えていると思います。私を修正してください。
+0

メソッド 'onComplete()'はありませんか?あなたは 'RxView.clicks'をどこから退会しますか? – Shujito

関連する問題