package com.twotoasters.jazzylistview.recyclerview;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.OnScrollListener;
import com.twotoasters.jazzylistview.JazzyEffect;
import com.twotoasters.jazzylistview.JazzyHelper;
public class JazzyRecyclerViewScrollListener extends OnScrollListener {
private final JazzyHelper mHelper;
private OnScrollListener mAdditionalOnScrollListener;
public JazzyRecyclerViewScrollListener() {
mHelper = new JazzyHelper();
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
int firstVisibleItem = recyclerView.getChildPosition(recyclerView.getChildAt(0));
int visibleItemCount = recyclerView.getChildCount();
int totalItemCount = recyclerView.getAdapter().getItemCount();
mHelper.onScrolled(recyclerView, firstVisibleItem, visibleItemCount, totalItemCount);
notifyAdditionalOnScrolledListener(recyclerView, dx, dy);
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
switch (newState) {
case RecyclerView.SCROLL_STATE_SETTLING: // fall through
case RecyclerView.SCROLL_STATE_DRAGGING:
mHelper.setScrolling(true);
break;
case RecyclerView.SCROLL_STATE_IDLE:
mHelper.setScrolling(false);
break;
default:
break;
}
notifyAdditionalOnScrollStateChangedListener(recyclerView, newState);
}
/**
* Sets the desired transition effect.
*
* @param transitionEffect Numeric constant representing a bundled transition effect.
*/
public void setTransitionEffect(int transitionEffect) {
mHelper.setTransitionEffect(transitionEffect);
}
/**
* Sets the desired transition effect.
*
* @param transitionEffect The non-bundled transition provided by the client.
*/
public void setTransitionEffect(JazzyEffect transitionEffect) {
mHelper.setTransitionEffect(transitionEffect);
}
/**
* Sets whether new items or all items should be animated when they become visible.
*
* @param onlyAnimateNew True if only new items should be animated; false otherwise.
*/
public void setShouldOnlyAnimateNewItems(boolean onlyAnimateNew) {
mHelper.setShouldOnlyAnimateNewItems(onlyAnimateNew);
}
/**
* Stop animations after the list has reached a certain velocity. When the list slows down
* it will start animating again. This gives a performance boost as well as preventing
* the list from animating under the users finger if they suddenly stop it.
*
* @param itemsPerSecond, set to JazzyHelper.MAX_VELOCITY_OFF to turn off max velocity.
* While 13 is a good default, it is dependent on the size of your items.
*/
public void setMaxAnimationVelocity(int itemsPerSecond) {
mHelper.setMaxAnimationVelocity(itemsPerSecond);
}
public void setOnScrollListener(OnScrollListener l) {
// hijack the scroll listener setter and have this list also notify the additional listener
mAdditionalOnScrollListener = l;
}
/**
* Notifies the OnScrollListener of an onScroll event, since JazzyListView is the primary listener for onScroll events.
*/
private void notifyAdditionalOnScrolledListener(RecyclerView recyclerView, int dx, int dy) {
if (mAdditionalOnScrollListener != null) {
mAdditionalOnScrollListener.onScrolled(recyclerView, dx, dy);
}
}
/**
* Notifies the OnScrollListener of an onScrollStateChanged event, since JazzyListView is the primary listener for onScrollStateChanged events.
*/
private void notifyAdditionalOnScrollStateChangedListener(RecyclerView recyclerView, int newState) {
if (mAdditionalOnScrollListener != null) {
mAdditionalOnScrollListener.onScrollStateChanged(recyclerView, newState);
}
}
}