这个是一个针对RecyclerView实现的滚动回弹效果,目前仅针对LinearLayoutManager做了拓展。核心代码是:
首先,通过修改LinearLayoutManager的滚动方法scrollVerticallyBy,实现over scroll。
@Override
public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
/* scroll before content */
int scrolled = scrollVerticallyBefore(dy, recycler, state);
/* scroll content */
scrolled += super.scrollVerticallyBy(dy - scrolled, recycler, state);
/* scroll after content */
scrolled += scrollVerticallyAfter(dy - scrolled, recycler, state);
/* if still throw {java.lang.IllegalArgumentException: Pixel distance must be non-negative}
just disable prefect 0.0 */
//this.setItemPrefetchEnabled(mOverOffsetY == 0);
return scrolled;
}
然后修改onScrollStateChanged方法,在滚动结束的时候实现回弹效果:
@Override
public void onScrollStateChanged(int state) {
super.onScrollStateChanged(state);
if (state == RecyclerView.SCROLL_STATE_IDLE) {
if (mOverScrollY != 0) {
this.mRecyclerView.smoothScrollBy(0, -mOverScrollY);
}
}
}
完整代码如下:
/**
* Description: extend LinearLayoutManager for over scroll or fling
* Author: xuqingqi
* E-mail: xuqingqi01@gmail.com
* Date: 2017/6/15
*/
public class LinearLayoutManagerExtend extends LinearLayoutManager {
private static final String TAG = LinearLayoutManagerExtend.class.getSimpleName();
private static final int MAX_OVER_SCROLL_DOWN = -128;
private static final int MAX_OVER_SCROLL_UP = 128;
private RecyclerView mRecyclerView;
private int mMaxOverScrollUp;
private int mMaxOverScrollDown;
private