From 627608e1488abb9c826408280da7d5c5a05488d6 Mon Sep 17 00:00:00 2001 From: Gavriil Sitnikov Date: Thu, 14 Jul 2016 06:05:40 +0300 Subject: [PATCH] view holder binding optimized --- .../listing/adapters/BindableViewHolder.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/touchin/roboswag/components/listing/adapters/BindableViewHolder.java b/src/main/java/ru/touchin/roboswag/components/listing/adapters/BindableViewHolder.java index d4a8fe4..d7149db 100644 --- a/src/main/java/ru/touchin/roboswag/components/listing/adapters/BindableViewHolder.java +++ b/src/main/java/ru/touchin/roboswag/components/listing/adapters/BindableViewHolder.java @@ -24,6 +24,8 @@ import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.View; +import java.util.concurrent.TimeUnit; + import ru.touchin.roboswag.components.navigation.UiBindable; import rx.Observable; import rx.android.schedulers.AndroidSchedulers; @@ -35,14 +37,24 @@ import rx.subjects.BehaviorSubject; */ public class BindableViewHolder extends RecyclerView.ViewHolder implements UiBindable { + // it is needed to delay detach to avoid re-subscriptions on fast scroll + private static final long DETACH_DELAY = TimeUnit.SECONDS.toMillis(1); + @NonNull private final UiBindable baseBindable; @NonNull private final BehaviorSubject attachedToWindowSubject = BehaviorSubject.create(); + private final Observable attachedObservable; public BindableViewHolder(@NonNull final UiBindable baseBindable, @NonNull final View itemView) { super(itemView); this.baseBindable = baseBindable; + attachedObservable = attachedToWindowSubject + .switchMap(attached -> attached + ? Observable.just(true) + : Observable.timer(DETACH_DELAY, TimeUnit.MILLISECONDS).map(ignored -> false)) + .replay(1) + .refCount(); } @CallSuper @@ -62,7 +74,7 @@ public class BindableViewHolder extends RecyclerView.ViewHolder implements UiBin @NonNull @Override public Observable bind(@NonNull final Observable observable) { - return attachedToWindowSubject + return attachedObservable .switchMap(isStarted -> isStarted ? observable.observeOn(AndroidSchedulers.mainThread()) : Observable.never()); } @@ -75,6 +87,6 @@ public class BindableViewHolder extends RecyclerView.ViewHolder implements UiBin @NonNull @Override public Observable untilDestroy(@NonNull final Observable observable) { - return baseBindable.untilStop(observable); + return baseBindable.untilDestroy(observable); } }