片段替换后,使用RxJava2 + RxBinding的RecyclerView项目单击不起作用

Ruw*_*han 1 android android-fragments android-recyclerview rx-binding rx-java2

我在Fragment中有一个RecyclerView,如该SO回答中所述,使用RxJava2处理了项目单击,在非片段中工作正常。

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;
    }
Run Code Online (Sandbox Code Playgroud)

片段中的RecyclerView只能正常运行一次。在项目单击片段上替换为另一个片段。后按后,出现RecyclerView片段,但单击不再起作用。

如果我删除该.takeUntil(RxView.detaches(parent))行,它将起作用。我认为有必要在RecyclerView未显示(分离)时破坏RxView单击的牢固绑定。我该如何解决这个问题?我正在寻找使用附加/分离事件之一解决问题的方法,任何建议都很棒!谢谢。

Wro*_*bel 6

为了回答您的问题和评论,我将为RecylerView + RxJava发送完整的解决方案:

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.onComplete(); //here we avoid memory leaks
}
Run Code Online (Sandbox Code Playgroud)

  • 方法不是onComplete()吗?您在哪里退订`RxView.clicks`? (3认同)