RecyclerView Auto Scroll Loader
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
public abstract class OnScrollListener extends RecyclerView.OnScrollListener {
    private LinearLayoutManager mLayoutManager;
    private int mVisibleThreshold = 2;
    private int mPreviousItemCount = 0;
    private boolean mLoading = true;
    /**
     * Set this listener to RecyclerView#addOnScrollListener
     *
     * @param mVisibleThreshold is number of remaining items before loading more.
     * @param layoutManager android.support.v7.widget.LinearLayoutManager
     */
    public OnScrollListener(int mVisibleThreshold, LinearLayoutManager layoutManager) {
        this.mVisibleThreshold = mVisibleThreshold;
        this.mLayoutManager = layoutManager;
    }
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        onScrolled();
        int visibleItemCount = mLayoutManager.getChildCount();
        int totalItemCount = mLayoutManager.getItemCount();
        int firstVisibleItems = mLayoutManager.findFirstVisibleItemPosition();
        resetLoadingFrg(totalItemCount);
        loadNextItems(visibleItemCount, totalItemCount, firstVisibleItems);
    }
    public void resetLoadingFrg(int total) {
        if (mLoading && total > mPreviousItemCount){
            mLoading = false;
            mPreviousItemCount = total;
        }
    }
    public void loadNextItems(int visible, int total, int first) {
        if (!mLoading && total <= (first + visible + mVisibleThreshold)) {
            mLoading = true;
            onLoad();
        }
    }
    public void reset() {
        mPreviousItemCount = 0;
        mLoading = true;
    }
    public int getPreviousItemCount() {
        return mPreviousItemCount;
    }
    public abstract void onScrolled();
    public abstract void onLoad();
}