フラグメントに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
}
セットアップの提案のために、それは素晴らしい作品onBindViewHolder – Wrobel
@Wrobelのおかげでクリックする必要があります –
メモリリークを避けるためにtakeUntil()が必要なため – Wrobel