diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ArticleListFragment.java b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ArticleListFragment.java index f6ec48777..1f0d243ce 100644 --- a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ArticleListFragment.java +++ b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ArticleListFragment.java @@ -151,22 +151,29 @@ public void onItemClick(int position) { } @Override - protected void resetContent() { - if(tagLabel != null) { - List tags = tagDao.queryBuilder() - .where(TagDao.Properties.Label.eq(tagLabel)) - .orderDesc(TagDao.Properties.Label) - .list(); - - tagIDs = new ArrayList<>(tags.size()); - for(Tag t: tags) { - tagIDs.add(t.getId()); + protected List
load() { + if(cleanLoad) { + if(tagLabel != null) { + List tags = tagDao.queryBuilder() + .where(TagDao.Properties.Label.eq(tagLabel)) + .orderDesc(TagDao.Properties.Label) + .list(); + + tagIDs = new ArrayList<>(tags.size()); + for(Tag t: tags) { + tagIDs.add(t.getId()); + } + } else { + tagIDs = null; } - } else { - tagIDs = null; } - super.resetContent(); + return super.load(); + } + + @Override + protected void processContent(List
items) { + super.processContent(items); forceContentUpdate = false; } diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/RecyclerViewListFragment.java b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/RecyclerViewListFragment.java index 27c5c5572..fe13376cf 100644 --- a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/RecyclerViewListFragment.java +++ b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/RecyclerViewListFragment.java @@ -4,6 +4,9 @@ import android.support.annotation.IdRes; import android.support.annotation.LayoutRes; import android.support.v4.app.Fragment; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.AsyncTaskLoader; +import android.support.v4.content.Loader; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.util.DiffUtil; import android.support.v7.widget.LinearLayoutManager; @@ -20,7 +23,7 @@ import fr.gaulupeau.apps.InThePoche.R; public abstract class RecyclerViewListFragment extends Fragment - implements Sortable, Searchable { + implements Sortable, Searchable, LoaderManager.LoaderCallbacks> { private static final String TAG = "RecyclerVLFragment"; @@ -41,6 +44,9 @@ public abstract class RecyclerViewListFragment extends Fragment protected boolean active = false; protected boolean invalidList = true; + protected boolean cleanLoad = true; + protected int currentPage = 0; + public RecyclerViewListFragment() {} @Override @@ -129,6 +135,54 @@ public void onSaveInstanceState(Bundle outState) { if(searchQuery != null) outState.putString(STATE_SEARCH_QUERY, searchQuery); } + @Override + public Loader> onCreateLoader(int id, Bundle args) { + Log.d(TAG, "onCreateLoader()"); + + return new AsyncTaskLoader>(getActivity()) { + @Override + public List loadInBackground() { + return load(); + } + + @Override + public void deliverResult(List articles) { + if(isStarted()) { // TODO: check + super.deliverResult(articles); + } + } + + @Override + protected void onStartLoading() { + forceLoad(); + } + + @Override + protected void onStopLoading() { + cancelLoad(); + } + + @Override + protected void onReset() { + super.onReset(); + + onStopLoading(); + } + }; + } + + @Override + public void onLoadFinished(Loader> loader, List data) { + Log.d(TAG, "onLoadFinished()"); + + processContent(data); + } + + @Override + public void onLoaderReset(Loader> loader) { + Log.d(TAG, "onLoaderReset()"); + } + @Override public void setSortOrder(Sortable.SortOrder sortOrder) { Sortable.SortOrder oldSortOrder = this.sortOrder; @@ -173,8 +227,32 @@ protected void checkList() { protected abstract RecyclerView.Adapter getListAdapter(List list); + protected void restartLoader() { + Log.d(TAG, "restartLoader()"); + + getLoaderManager().restartLoader(0, null, this); + } + protected void resetContent() { - List items = getItems(0); + Log.d(TAG, "resetContent()"); + + cleanLoad = true; + currentPage = 0; + restartLoader(); + } + + protected void processContent(List items) { + Log.d(TAG, "processContent() items.size(): " + items.size()); + + if(cleanLoad) { + processContentClean(items); + } else { + processContentAdd(items); + } + } + + protected void processContentClean(List items) { + Log.d(TAG, "processContentClean() items.size(): " + items.size()); boolean scrollToTop = false; if(recyclerViewLayoutManager != null) { @@ -195,14 +273,14 @@ protected void resetContent() { } } - protected void loadMore(int page, final int totalItemsCount) { - Log.d(TAG, String.format("loadMore(page: %d, totalItemsCount: %d)", page, totalItemsCount)); - - List items = getItems(page); - final int addedItemsCount = items.size(); + protected void processContentAdd(List items) { + Log.d(TAG, "processContentAdd() items.size(): " + items.size()); itemList.addAll(items); + final int addedItemsCount = items.size(); + final int totalItemsCount = itemList.size(); + recyclerView.post(new Runnable() { @Override public void run() { @@ -211,6 +289,31 @@ public void run() { }); } + protected void loadMore(int page, final int totalItemsCount) { + Log.d(TAG, String.format("loadMore(page: %d, totalItemsCount: %d)", page, totalItemsCount)); + + if(page <= currentPage) return; + + currentPage++; + if(page != currentPage) { + Log.w(TAG, String.format("loadMore() page request mismatch!" + + " page: %d, currentPage: %d; resetting", + page, currentPage)); + + resetContent(); + return; + } + + cleanLoad = false; + restartLoader(); + } + + protected List load() { + Log.d(TAG, "load()"); + + return getItems(currentPage); + } + protected abstract List getItems(int page); protected abstract DiffUtil.Callback getDiffUtilCallback(List oldItems, List newItems);