From 644baccbdd6cbf6ff0bee1294e5470ad9bbf338d Mon Sep 17 00:00:00 2001 From: Gavriil Sitnikov Date: Fri, 10 Jun 2016 18:46:55 +0300 Subject: [PATCH] fix_try --- .../adapters/ObservableCollectionAdapter.java | 63 ++++++++++++++++--- 1 file changed, 55 insertions(+), 8 deletions(-) diff --git a/src/main/java/ru/touchin/roboswag/components/listing/adapters/ObservableCollectionAdapter.java b/src/main/java/ru/touchin/roboswag/components/listing/adapters/ObservableCollectionAdapter.java index 62301f1..44cf028 100644 --- a/src/main/java/ru/touchin/roboswag/components/listing/adapters/ObservableCollectionAdapter.java +++ b/src/main/java/ru/touchin/roboswag/components/listing/adapters/ObservableCollectionAdapter.java @@ -26,6 +26,7 @@ import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; +import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -39,6 +40,7 @@ import ru.touchin.roboswag.core.observables.collections.ObservableList; import ru.touchin.roboswag.core.utils.ShouldNotHappenException; import rx.Observable; import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; import rx.functions.Actions; import rx.subjects.BehaviorSubject; @@ -68,11 +70,51 @@ public abstract class ObservableCollectionAdapter historyPreLoadingObservable; + private final ObservableList innerCollection = new ObservableList<>(); + public ObservableCollectionAdapter(@NonNull final UiBindable uiBindable) { super(); this.uiBindable = uiBindable; - uiBindable.bind(observableCollectionSubject - .switchMap(observableCollection -> observableCollection != null ? observableCollection.observeChanges() : Observable.empty())) + observableCollectionSubject + .observeOn(AndroidSchedulers.mainThread()) + .doOnNext(collection -> innerCollection.set(collection != null ? collection.getItems() : new ArrayList<>())) + .switchMap(observableCollection -> observableCollection != null + ? observableCollection.observeChanges().observeOn(AndroidSchedulers.mainThread()) + : Observable.empty()) + .subscribe(changes -> { + for (final Change change : changes.getChanges()) { + switch (change.getType()) { + case INSERTED: + int i = 0; + for (TItem item : change.getChangedItems()) { + Lc.d("added " + item + " at " + (change.getStart() + i)); + i++; + } + innerCollection.addAll(change.getStart(), change.getChangedItems()); + break; + case CHANGED: + int j = 0; + for (TItem item : change.getChangedItems()) { + Lc.d("changed " + item + " at " + (change.getStart() + j)); + j++; + } + innerCollection.update(change.getStart(), change.getChangedItems()); + break; + case REMOVED: + int k = 0; + for (TItem item : change.getChangedItems()) { + Lc.d("removed " + item + " at " + (change.getStart() + k)); + k++; + } + innerCollection.remove(change.getStart(), change.getCount()); + break; + default: + Lc.assertion("Not supported " + change.getType()); + break; + } + } + }); + innerCollection.observeChanges() .subscribe(this::onItemsChanged); newItemsUpdatingObservable = uiBindable.untilStop(observableCollectionSubject .switchMap(observableCollection -> observableCollection != null ? observableCollection.loadItem(0) : Observable.empty())); @@ -113,7 +155,8 @@ public abstract class ObservableCollectionAdapter collectionChange) { if (observableCollectionSubject.getValue() == null) { return; } @@ -132,18 +175,21 @@ public abstract class ObservableCollectionAdapter changes) { + private void notifyAboutChanges(@NonNull final Collection> changes) { for (final Change change : changes) { switch (change.getType()) { case INSERTED: @@ -187,7 +233,8 @@ public abstract class ObservableCollectionAdapter