From 2324121e59144b8714d5c5ff9c48832cac06e945 Mon Sep 17 00:00:00 2001 From: Denis Karmyshakov Date: Fri, 30 Jun 2017 17:48:57 +0300 Subject: [PATCH] Optional diff utils use --- build.gradle | 4 +- .../adapters/ObservableCollectionAdapter.java | 121 ++++++++++-------- 2 files changed, 67 insertions(+), 58 deletions(-) diff --git a/build.gradle b/build.gradle index f1d85de..a3433c4 100644 --- a/build.gradle +++ b/build.gradle @@ -18,8 +18,8 @@ android { dependencies { compile project(':libraries:core') - provided 'com.android.support:appcompat-v7:25.3.1' - provided 'com.android.support:recyclerview-v7:25.3.1' + provided 'com.android.support:appcompat-v7:25.4.0' + provided 'com.android.support:recyclerview-v7:25.4.0' provided 'io.reactivex:rxandroid:1.2.1' provided 'io.reactivex:rxjava:1.3.0' diff --git a/src/main/java/ru/touchin/roboswag/components/adapters/ObservableCollectionAdapter.java b/src/main/java/ru/touchin/roboswag/components/adapters/ObservableCollectionAdapter.java index bb277a5..dc4cad9 100644 --- a/src/main/java/ru/touchin/roboswag/components/adapters/ObservableCollectionAdapter.java +++ b/src/main/java/ru/touchin/roboswag/components/adapters/ObservableCollectionAdapter.java @@ -34,14 +34,16 @@ import java.util.List; import ru.touchin.roboswag.components.utils.LifecycleBindable; import ru.touchin.roboswag.components.utils.UiUtils; import ru.touchin.roboswag.core.log.Lc; -import ru.touchin.roboswag.core.observables.collections.Change; import ru.touchin.roboswag.core.observables.collections.ObservableCollection; import ru.touchin.roboswag.core.observables.collections.ObservableList; +import ru.touchin.roboswag.core.observables.collections.changes.Change; +import ru.touchin.roboswag.core.observables.collections.changes.ChangePayloadProducer; +import ru.touchin.roboswag.core.observables.collections.changes.CollectionChanges; +import ru.touchin.roboswag.core.observables.collections.changes.SameItemsPredicate; import ru.touchin.roboswag.core.observables.collections.loadable.LoadingMoreList; import ru.touchin.roboswag.core.utils.Optional; import ru.touchin.roboswag.core.utils.ShouldNotHappenException; import rx.Observable; -import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Action2; import rx.functions.Action3; @@ -98,17 +100,12 @@ public abstract class ObservableCollectionAdapter { final ObservableCollection collection = optional.get(); - if (collection == null) { - innerCollection.clear(); - return Observable.empty(); - } - innerCollection.set(collection.getItems()); - return collection.observeChanges().observeOn(AndroidSchedulers.mainThread()); - }), this::onApplyChanges); + return collection != null ? collection.observeItems() : Observable.just(Collections.emptyList()); + }), innerCollection::set); lifecycleBindable.untilDestroy(createMoreAutoLoadingObservable()); } @@ -135,26 +132,6 @@ public abstract class ObservableCollectionAdapter changes) { - anyChangeApplied = true; - for (final Change change : changes.getChanges()) { - switch (change.getType()) { - case INSERTED: - innerCollection.addAll(change.getStart(), change.getChangedItems()); - break; - case CHANGED: - innerCollection.update(change.getStart(), change.getChangedItems()); - break; - case REMOVED: - innerCollection.remove(change.getStart(), change.getCount()); - break; - default: - Lc.assertion("Not supported " + change.getType()); - break; - } - } - } - /** * Returns if any change of source collection applied to adapter. * It's important to not show some footers or headers before first change have applied. @@ -223,7 +200,6 @@ public abstract class ObservableCollectionAdapter observableCollection) { this.observableCollectionSubject.onNext(new Optional<>(observableCollection)); - refreshUpdate(); } /** @@ -238,9 +214,9 @@ public abstract class ObservableCollectionAdapter collectionChange) { + protected void onItemsChanged(@NonNull final CollectionChanges collectionChanges) { if (Looper.myLooper() != Looper.getMainLooper()) { Lc.assertion("Items changes called on not main thread"); return; @@ -250,14 +226,14 @@ public abstract class ObservableCollectionAdapter> changes) { + private void notifyAboutChanges(@NonNull final Collection changes) { for (final Change change : changes) { - switch (change.getType()) { - case INSERTED: - notifyItemRangeInserted(change.getStart() + getHeadersCount(), change.getCount()); - break; - case CHANGED: - notifyItemRangeChanged(change.getStart() + getHeadersCount(), change.getCount()); - break; - case REMOVED: - if (getItemCount() - getHeadersCount() == 0) { - //TODO: bug of recyclerview? - notifyDataSetChanged(); - } else { - notifyItemRangeRemoved(change.getStart() + getHeadersCount(), change.getCount()); - } - break; - default: - Lc.assertion("Not supported " + change.getType()); - break; + if (change instanceof Change.Inserted) { + final Change.Inserted castedChange = (Change.Inserted) change; + notifyItemRangeInserted(castedChange.getPosition() + getHeadersCount(), castedChange.getCount()); + } else if (change instanceof Change.Removed) { + if (getItemCount() - getHeadersCount() == 0) { + //TODO: bug of recyclerview? + notifyDataSetChanged(); + } else { + final Change.Removed castedChange = (Change.Removed) change; + notifyItemRangeRemoved(castedChange.getPosition() + getHeadersCount(), castedChange.getCount()); + } + } else if (change instanceof Change.Moved) { + final Change.Moved castedChange = (Change.Moved) change; + notifyItemMoved(castedChange.getFromPosition() + getHeadersCount(), castedChange.getToPosition() + getHeadersCount()); + } else if (change instanceof Change.Changed) { + final Change.Changed castedChange = (Change.Changed) change; + notifyItemRangeChanged( + castedChange.getPosition() + getHeadersCount(), + castedChange.getCount(), + castedChange.getPayload()); + } else { + Lc.assertion("Not supported " + change); } } } @@ -624,6 +604,35 @@ public abstract class ObservableCollectionAdapter sameItemsPredicate, + @Nullable final ChangePayloadProducer changePayloadProducer) { + innerCollection.enableDiffUtils(detectMoves, sameItemsPredicate, changePayloadProducer); + } + + /** + * Disable diff utils algorithm. + */ + public void disableDiffUtils() { + innerCollection.disableDiffUtils(); + } + + /** + * Returns enabled flag of diff utils. + * + * @return true if diff utils is enabled. + */ + public boolean diffUtilsIsEnabled() { + return innerCollection.diffUtilsIsEnabled(); + } + /** * Interface to simply add item click listener. *