add minor improvements to paginf provider

This commit is contained in:
Ilia Kurtov 2016-05-27 16:41:31 +03:00
parent 8d921a6a14
commit 27aadbb40e
1 changed files with 26 additions and 9 deletions

View File

@ -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<T> extends ItemsProvider<T> {
private final SparseArray<Observable<List<T>>> loadingPages = new SparseArray<>();
@Nullable
private Integer maxLoadedPage;
private boolean isLastPageLoaded;
private final BehaviorSubject<Boolean> isLastPageLoadedSubject = BehaviorSubject.create(false);
public AbstractSimplePagingProvider(final int pageSize) {
super();
this.pageSize = pageSize;
}
public void updateLoadedPages(@NonNull final List<T> startedDataList) {
for (int page = 0; page < startedDataList.size() / pageSize; page++) {
final List<T> 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<T> extends ItemsProvider<T> {
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<T> extends ItemsProvider<T> {
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<List<T>> loadingPage = loadingPages.get(indexOfPage);
@ -142,19 +155,18 @@ public abstract class AbstractSimplePagingProvider<T> extends ItemsProvider<T> {
.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<T> extends ItemsProvider<T> {
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<T> extends ItemsProvider<T> {
}
}
@NonNull
public Observable<Boolean> observeListLoadingFinished() {
return isLastPageLoadedSubject.distinctUntilChanged();
}
}