RecyclerView load more helper class
Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/commit/40085c58 Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/tree/40085c58 Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/diff/40085c58 Branch: refs/heads/master Commit: 40085c58fb4cbf41b75ac6e9937b53c5d6df0929 Parents: 9a4bac6 Author: Sagar <[email protected]> Authored: Fri May 6 16:52:07 2016 +0530 Committer: Sagar <[email protected]> Committed: Fri May 6 16:54:30 2016 +0530 ---------------------------------------------------------------------- .../EndlessRecyclerOnScrollListener.java | 46 ++++++++++++++++++++ .../taverna/mobile/ui/base/BasePresenter.java | 41 +++++++++++++++++ .../apache/taverna/mobile/ui/base/MvpView.java | 11 +++++ .../taverna/mobile/ui/base/Presenter.java | 12 +++++ 4 files changed, 110 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/40085c58/app/src/main/java/org/apache/taverna/mobile/ui/adapter/EndlessRecyclerOnScrollListener.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/ui/adapter/EndlessRecyclerOnScrollListener.java b/app/src/main/java/org/apache/taverna/mobile/ui/adapter/EndlessRecyclerOnScrollListener.java new file mode 100644 index 0000000..c9d1aee --- /dev/null +++ b/app/src/main/java/org/apache/taverna/mobile/ui/adapter/EndlessRecyclerOnScrollListener.java @@ -0,0 +1,46 @@ +package org.apache.taverna.mobile.ui.adapter; + +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; + +public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener { + public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName(); + + private int previousTotal = 0; // The total number of items in the dataset after the last load + private boolean loading = true; // True if we are still waiting for the last set of data to load. + private int visibleThreshold = 1; // The minimum amount of items to have below your current scroll position before loading more. + int firstVisibleItem, visibleItemCount, totalItemCount; + + private int current_page = 1; + + private LinearLayoutManager mLinearLayoutManager; + + public EndlessRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager) { + this.mLinearLayoutManager = linearLayoutManager; + } + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + + visibleItemCount = recyclerView.getChildCount(); + totalItemCount = mLinearLayoutManager.getItemCount(); + firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition(); + + if (loading) { + if (totalItemCount > previousTotal+1) { + loading = false; + previousTotal = totalItemCount; + } + } + if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { + // End has been reached + // Do something + current_page++; + onLoadMore(current_page); + loading = true; + } + } + + public abstract void onLoadMore(int current_page); +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/40085c58/app/src/main/java/org/apache/taverna/mobile/ui/base/BasePresenter.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/ui/base/BasePresenter.java b/app/src/main/java/org/apache/taverna/mobile/ui/base/BasePresenter.java new file mode 100644 index 0000000..040f720 --- /dev/null +++ b/app/src/main/java/org/apache/taverna/mobile/ui/base/BasePresenter.java @@ -0,0 +1,41 @@ +package org.apache.taverna.mobile.ui.base; + +/** + * Base class that implements the Presenter interface and provides a base implementation for + * attachView() and detachView(). It also handles keeping a reference to the mvpView that + * can be accessed from the children classes by calling getMvpView(). + */ +public class BasePresenter<T extends MvpView> implements Presenter<T> { + + private T mMvpView; + + @Override + public void attachView(T mvpView) { + mMvpView = mvpView; + } + + @Override + public void detachView() { + mMvpView = null; + } + + public boolean isViewAttached() { + return mMvpView != null; + } + + public T getMvpView() { + return mMvpView; + } + + public void checkViewAttached() { + if (!isViewAttached()) throw new MvpViewNotAttachedException(); + } + + public static class MvpViewNotAttachedException extends RuntimeException { + public MvpViewNotAttachedException() { + super("Please call Presenter.attachView(MvpView) before" + + " requesting data to the Presenter"); + } + } +} + http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/40085c58/app/src/main/java/org/apache/taverna/mobile/ui/base/MvpView.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/ui/base/MvpView.java b/app/src/main/java/org/apache/taverna/mobile/ui/base/MvpView.java new file mode 100644 index 0000000..67dc5b3 --- /dev/null +++ b/app/src/main/java/org/apache/taverna/mobile/ui/base/MvpView.java @@ -0,0 +1,11 @@ +package org.apache.taverna.mobile.ui.base; + + +/** + * Base interface that any class that wants to act as a View in the MVP (Model View Presenter) + * pattern must implement. Generally this interface will be extended by a more specific interface + * that then usually will be implemented by an Activity or Fragment. + */ +public interface MvpView { + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/40085c58/app/src/main/java/org/apache/taverna/mobile/ui/base/Presenter.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/ui/base/Presenter.java b/app/src/main/java/org/apache/taverna/mobile/ui/base/Presenter.java new file mode 100644 index 0000000..78d3d33 --- /dev/null +++ b/app/src/main/java/org/apache/taverna/mobile/ui/base/Presenter.java @@ -0,0 +1,12 @@ +package org.apache.taverna.mobile.ui.base; + +/** + * Every presenter in the app must either implement this interface or extend BasePresenter + * indicating the MvpView type that wants to be attached with. + */ +public interface Presenter<V extends MvpView> { + + void attachView(V mvpView); + + void detachView(); +}
