diff --git a/src/main/java/ru/touchin/roboswag/components/listing/AbstractSimplePagingProvider.java b/src/main/java/ru/touchin/roboswag/components/listing/AbstractSimplePagingProvider.java index 4b9f1c5..f8440f2 100644 --- a/src/main/java/ru/touchin/roboswag/components/listing/AbstractSimplePagingProvider.java +++ b/src/main/java/ru/touchin/roboswag/components/listing/AbstractSimplePagingProvider.java @@ -32,6 +32,7 @@ import ru.touchin.roboswag.core.log.Lc; import ru.touchin.roboswag.core.utils.android.RxAndroidUtils; import rx.Observable; import rx.Scheduler; +import rx.subjects.BehaviorSubject; /** * Created by Ilia Kurtov on 12.05.2016. @@ -48,13 +49,25 @@ public abstract class AbstractSimplePagingProvider extends ItemsProvider { private final SparseArray>> loadingPages = new SparseArray<>(); @Nullable private Integer maxLoadedPage; - private boolean isLastPageLoaded; + private final BehaviorSubject isLastPageLoadedSubject = BehaviorSubject.create(false); public AbstractSimplePagingProvider(final int pageSize) { super(); this.pageSize = pageSize; } + public void updateLoadedPages(@NonNull final List startedDataList) { + for (int page = 0; page < startedDataList.size() / pageSize; page++) { + final List pageList = new ArrayList<>(); + for (int i = pageSize * page; i < pageSize * (page + 1); i++) { + pageList.add(startedDataList.get(i)); + } + loadedPages.put(page, pageList); + } + maxLoadedPage = startedDataList.size() / pageSize - 1; + } + + public int getPageSize() { return pageSize; } @@ -63,7 +76,7 @@ public abstract class AbstractSimplePagingProvider extends ItemsProvider { public int getSize() { synchronized (lock) { return (maxLoadedPage != null ? maxLoadedPage * pageSize + loadedPages.get(maxLoadedPage).size() : 0) - + (isLastPageLoaded ? 0 : 1); + + (isLastPageLoadedSubject.getValue() ? 0 : 1); } } @@ -109,7 +122,7 @@ public abstract class AbstractSimplePagingProvider extends ItemsProvider { subscriber.onNext(page != null && page.size() > indexOnPage ? page.get(indexOnPage) : null); subscriber.onCompleted(); }).switchMap(item -> { - if (item != null || (isLastPageLoaded && maxLoadedPage != null && maxLoadedPage <= indexOfPage)) { + if (item != null || (isLastPageLoadedSubject.getValue() && maxLoadedPage != null && maxLoadedPage <= indexOfPage)) { return Observable.just(item); } Observable> loadingPage = loadingPages.get(indexOfPage); @@ -142,19 +155,18 @@ public abstract class AbstractSimplePagingProvider extends ItemsProvider { .doOnNext(pageItems -> { synchronized (lock) { final int oldSize = getSize(); - final boolean oldIsLastPageLoaded = isLastPageLoaded; + final boolean oldIsLastPageLoaded = isLastPageLoadedSubject.getValue(); if (pageItems.size() < pageSize) { if (maxLoadedPage != null && maxLoadedPage > indexOfPage) { maxLoadedPage = indexOfPage == 0 || !pageItems.isEmpty() ? indexOfPage : null; downgradeMaxLoadedPages(indexOfPage); - isLastPageLoaded = false; + isLastPageLoadedSubject.onNext(false); } if (shouldReplaceMaxLoaded(pageItems, indexOfPage)) { maxLoadedPage = indexOfPage; } - isLastPageLoaded = isLastPageLoaded - || (maxLoadedPage != null - && (maxLoadedPage == indexOfPage || maxLoadedPage == indexOfPage - 1)); + isLastPageLoadedSubject.onNext(isLastPageLoadedSubject.getValue() + || (maxLoadedPage != null && (maxLoadedPage == indexOfPage || maxLoadedPage == indexOfPage - 1))); } else if (shouldReplaceMaxLoaded(pageItems, indexOfPage)) { maxLoadedPage = indexOfPage; } @@ -198,7 +210,7 @@ public abstract class AbstractSimplePagingProvider extends ItemsProvider { changes.add(new Change(Change.Type.INSERTED, oldSize, size - oldSize)); } else { changes.add(new Change(Change.Type.REMOVED, size, oldSize - size)); - if (!isLastPageLoaded) { + if (!isLastPageLoadedSubject.getValue()) { changes.add(new Change(Change.Type.CHANGED, size - 1, 1)); } } @@ -217,4 +229,9 @@ public abstract class AbstractSimplePagingProvider extends ItemsProvider { } } + @NonNull + public Observable observeListLoadingFinished() { + return isLastPageLoadedSubject.distinctUntilChanged(); + } + }