自定义LinearLayoutManager,用recyclerview实现都利用了这个onScrollStateChanged(int state)方法,但我在滑动视频的时候怎么弄也不调用(原因是在设置该LayoutManager之前我利用LayoutManagers.LayoutManagerFactory设置上了一个。要想覆盖之前的,调用mRecyclerView.setLayoutManager就可以了),后来传了一个mRecyclerView实例,实现mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() 进行监听滑动状态的改变也是可以的
public class PagerLayoutManager extends LinearLayoutManager {
private PagerSnapHelper mPagerSnapHelper;
private OnViewPagerListener mOnViewPagerListener;
private RecyclerView mRecyclerView;
private int mDrift;//位移,用来判断移动方向
public PagerLayoutManager(Context context, int orientation) {
super(context, orientation, false);
init();
}
public PagerLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
init();
}
private void init() {
mPagerSnapHelper = new PagerSnapHelper();
}
@Override
public void onAttachedToWindow(RecyclerView view) {
super.onAttachedToWindow(view);
mPagerSnapHelper.attachToRecyclerView(view);
this.mRecyclerView = view;
mRecyclerView.addOnChildAttachStateChangeListener(mChildAttachStateChangeListener);
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
super.onLayoutChildren(recycler, state);
}
@Override
public void onScrollStateChanged(int state) {
super.onScrollStateChanged(state);
LogUtils.d("onScrollStateChanged===" + state);
LogUtils.d("getChildCount===" + getChildCount());
switch (state) {
case 0:
View viewIdle = mPagerSnapHelper.findSnapView(mRecyclerView.getLayoutManager());
if (viewIdle != null) {
int positionIdle = getPosition(viewIdle);
if (mOnViewPagerListener != null && getChildCount() == 1) {
mOnViewPagerListener.onPageSelected(positionIdle);
}
}
break;
}
}
/**
* 监听竖直方向的相对偏移量
*
* @param dy
* @param recycler
* @param state
* @return
*/
@Override
public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
this.mDrift = dy;
return super.scrollVerticallyBy(dy, recycler, state);
}
/**
* 监听水平方向的相对偏移量
*
* @param dx
* @param recycler
* @param state
* @return
*/
@Override
public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
this.mDrift = dx;
return super.scrollHorizontallyBy(dx, recycler, state);
}
/**
* 设置监听
*
* @param listener
*/
public void setOnViewPagerListener(OnViewPagerListener listener) {
this.mOnViewPagerListener = listener;
}
private int detachedPosition = -1;
private int attachedPosition = -1;
private RecyclerView.OnChildAttachStateChangeListener mChildAttachStateChangeListener = new RecyclerView.OnChildAttachStateChangeListener() {
/**
* itemView依赖Window
*/
@Override
public void onChildViewAttachedToWindow(View view) {
if (attachedPosition == -1 && mOnViewPagerListener != null) {
mOnViewPagerListener.onPageSelected(getPosition(view));
}
attachedPosition = getPosition(view);
}
/**
*itemView脱离Window
*/
@Override
public void onChildViewDetachedFromWindow(View view) {
detachedPosition = getPosition(view);
if (mOnViewPagerListener != null) mOnViewPagerListener.onPageRelease(detachedPosition);
}
};
interface OnViewPagerListener {
void onPageRelease(int var2);
void onPageSelected(int var1);
}
}