【问题标题】:RecyclerView item click using RxJava2 + RxBinding not working after Fragment replacementsRecyclerView 项目单击使用 RxJava2 + RxBinding 在片段替换后不起作用
【发布时间】:2017-06-08 10:24:05
【问题描述】:

我在 Fragment 中有一个 RecyclerView,使用 RxJava2 处理项目点击,如 this SO answer 中所述,它在非 Fragment 中工作正常。

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 只能正常工作一次。在项目单击片段被另一个片段替换。后按后,RecyclerView 片段出现,但点击不再起作用。

如果我删除 .takeUntil(RxView.detaches(parent)) 行,它会起作用。我认为当它不显示(分离)时,需要打破 RxView click 与 RecyclerView 的强绑定。我该如何解决这个问题?我希望使用附加/分离事件之一来解决问题,任何建议都会很棒!谢谢。

【问题讨论】:

  • 你应该设置点击 onBindViewHolder
  • @Wrobel 感谢您的建议,效果很好。我仍然对.takeUntil(RxView.detaches(parent)) 部分的使用感到困惑。在原始 SO 答案中使用它的原因是什么。现在我认为,既然它不会取消订阅,那么一开始就有这部分是没有意义的。请纠正我。
  • 因为你需要 takeUntil() 来避免内存泄漏
  • @Wrobel 好的,你能解释一下它是怎么发生的吗?如果可以的话,答案会很好。另一个问题,那么我该如何在onBindViewHolder 中做到这一点,我在那里没有任何关于父的参考。父级是否总是指向父级回收视图?如果是这样,我可以在takeUntil() 中使用它。

标签: android android-fragments android-recyclerview rx-java2 rx-binding


【解决方案1】:

为了回答您的问题和 cmets,我发送了 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
}

【讨论】:

  • 方法不就是onComplete()吗?你在哪里取消订阅RxView.clicks
  • 我们不需要取消订阅 Rx.View 点击,看到这个答案:stackoverflow.com/questions/41482036/…,是的,它是 onComplete(),我修正了这个拼写错误
猜你喜欢
  • 1970-01-01
  • 2019-03-31
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多