package com.byoutline.kickmaterial.views;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
/**
* @author Pawel Karczewski <pawel.karczewski at byoutline.com> on 2015-04-14
*/
public class EndlessRecyclerView extends RecyclerView {
private static final int DEFAULT_ITEMS_THRESHOLD = 2;
private static final int SCROLL_THRESHOLD = 1;
private int visibleItemsThreshold = DEFAULT_ITEMS_THRESHOLD;
private OnScrollListener scrollListener;
private EndlessScrollListener endlessScrollListener;
private int visibleItemCount;
private int totalItemCount;
private int lastVisibleItem;
public EndlessRecyclerView(Context context) {
super(context);
init();
}
public EndlessRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public EndlessRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public void setEndlessScrollListener(EndlessScrollListener listener) {
endlessScrollListener = listener;
}
private void init() {
super.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (scrollListener != null) {
scrollListener.onScrolled(recyclerView, dx, dy);
}
if (endlessScrollListener != null && dy > SCROLL_THRESHOLD) {
visibleItemCount = getChildCount();
totalItemCount = getLayoutManager().getItemCount();
lastVisibleItem = endlessScrollListener.getLastVisibleItemPosition();
boolean shouldLoadMoreData = lastVisibleItem + visibleItemsThreshold > totalItemCount;
if (endlessScrollListener.hasMoreDataAndNotLoading() && shouldLoadMoreData) {
endlessScrollListener.loadMoreData();
}
}
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (scrollListener != null) {
scrollListener.onScrollStateChanged(recyclerView, newState);
}
}
});
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
}
@Override
public void setOnScrollListener(OnScrollListener listener) {
scrollListener = listener;
}
public int getVisibleItemsThreshold() {
return visibleItemsThreshold;
}
public void setVisibleItemsThreshold(int visibleItemsThreshold) {
this.visibleItemsThreshold = visibleItemsThreshold;
}
public interface EndlessScrollListener {
int getLastVisibleItemPosition();
void loadMoreData();
boolean hasMoreDataAndNotLoading();
}
}