如何处理使用RxJava的回收站视图的项目点击

我有兴趣了解什么是响应回收商视图的项目点击的最佳方式。

通常我会添加一个onclick()监听器到ViewHolder,并通过一个接口将结果传递给activity / fragment。

我想在onBindViewHolder中添加一个Observable,但是我不想为每个项目绑定创build一个新的Observable。

  • 改造默认线程
  • IllegalArgumentException:找不到rx.Observable RxJava调用适配器,Retrofit2
  • 如何在java中消除一个翻新的被动请求?
  • 使用RxJava处理分页
  • 在Activity Lifecycle中处理RxJava / RxAndroid订阅的正确方法是什么?
  • 何时取消订阅订阅
  • 使用RxJava和Okhttp
  • RxJava和缓存数据
  • 你可以使用RxBinding ,然后在你的适配器内部创build一个主题,然后将所有的事件redirect到这个主题,并创build一个主体的getter作为一个observable,最后只是订阅你的observable。

    private PublishSubject<View> mViewClickSubject = PublishSubject.create(); public Observable<View> getViewClickedObservable() { return mViewClickSubject.asObservable(); } @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup pParent, int pViewType) { Context context = pParent.getContext(); View view = (View) LayoutInflater.from(context).inflate(R.layout.your_item_layout, pParent, false); ViewHolder viewHolder = new ViewHolder(view); RxView.clicks(view) .takeUntil(RxView.detaches(pParent)) .map(aVoid -> view) .subscribe(mViewClickSubject); return viewHolder; } 

    用法示例可以是:

     mMyAdapter.getViewClickedObservable() .subscribe(view -> /* do the action. */); 

    步骤1:将业务逻辑从活动中移出到域类/服务

    可选:使用https://github.com/roboguice/roboguice轻松连接您的服务&#x3002;

    第2步: @Inject (或只是设置)你的服务到你的适配器

    第3步:获取https://github.com/JakeWharton/RxBinding并使用适配器中的超级电源:

     RxView.clicks(button).subscribe(new Action1<Void>() { @Override public void call(Void aVoid) { myCoolService.doStuff(); } }); 

    第4步:获取运行时崩溃并了解如何处理订阅

    第5步:利润:)

    我build议你在点击时初始化每个元素的可见性,但是为了避免每次只使用cachingcaching第一次发出的项目时创build新的可观察值。

      /** * Here we can prove how the first time the items are delayed 100 ms per item emitted but second time becuase it´s cached we dont have any delay since * the item emitted are cached */ @Test public void cacheObservable() { Integer[] numbers = {0, 1, 2, 3, 4, 5}; Observable<Integer> observable = Observable.from(numbers) .doOnNext(number -> { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } }) .cache(); long time = System.currentTimeMillis(); observable.subscribe(System.out::println); System.out.println("First time took:" + (System.currentTimeMillis() - time)); time = System.currentTimeMillis(); observable.subscribe(System.out::println); System.out.println("Second time took:" + (System.currentTimeMillis() - time)); } 

    我的解决scheme很像@epool,除了使用EventBus模型。

    首先,创build一个RxBus:RxBus.java

     public class RxBus { private final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.create()); public void send(Object o) { _bus.onNext(o); } public Observable<Object> toObserverable() { return _bus; } public boolean hasObservers() { return _bus.hasObservers(); } } 

    那么,你有两种使用RxBus的方法。 使用RxBus引用创build自定义Application类,或者在Activity / Fragment中创buildRxBus,然后将其传递给适配器。 我用第一。

    MyApp.java

     public class MyApp extends Application { private static MyApp _instance; private RxBus _bus; public static MyApp get() { return _instance; } @Override public void onCreate() { super.onCreate(); _instance = this; _bus = new RxBus(); } public RxBus bus() { return _bus; } } 

    然后使用

     MyApp.get().bus() 

    得到RxBus实例。

    在Adpater中使用RxBus就是这样的:

     public class MyRecyclerAdapter extends ... { private RxBus _bus; public MykRecyclerAdapter (...) { .... _bus = MyApp.get().bus(); } public ViewHolder onCreateViewHolder (...) { _sub = RxView.longClicks(itemView) // You can use setOnLongClickListener as the same .subscribe(aVoid -> { if (_bus.hasObservers()) { _bus.send(new SomeEvent(...)); } }); } } 

    您可以使用_bus.send()发送任何课程,我们将在活动中接收:

     RxBus bus = MyApp.get().bus(); // get the same RxBus instance _sub = bus.toObserverable() .subscribe(e -> doSomething((SomeEvent) e)); 

    关于取消订阅。

    在MyRecyclerAdapter中调用clearup()方法中的_sub.unsubscribe(),并在Activity的onDestory()中调用_sub.unsubscribe()。

     @Override public void onDestroy() { super.onDestroy(); if (_adapter != null) { _adapter.cleanup(); } if (_sub != null) { _sub.unsubscribe() } }