Open TokenYc opened 6 years ago
@TokenYc 非常感谢,bug已经修改。初次进入的监听,修改为下面的这种,可以试一下
@Override
public void onInitComplete() {
Log.e(TAG,"onInitComplete");
playVideo(0);
}
onInitComplete 释放位置:0 下一页:true 选中位置:1 是否是滑动到底部:false 释放位置:1 下一页:true 选中位置:2 是否是滑动到底部:false 释放位置:2 下一页:true 选中位置:3 是否是滑动到底部:false 释放位置:2 下一页:true 选中位置:3 是否是滑动到底部:false
public class ViewPagerLayoutManager extends LinearLayoutManager { private static final String TAG = "ViewPagerLayoutManager"; private PagerSnapHelper mPagerSnapHelper; private OnViewPagerListener mOnViewPagerListener; private int mDrift;//位移,用来判断移动方向
public ViewPagerLayoutManager(Context context, int orientation) {
super(context, orientation, false);
init();
}
public ViewPagerLayoutManager(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);
view.addOnChildAttachStateChangeListener(mChildAttachStateChangeListener);
}
/**
* 滑动状态的改变
* 缓慢拖拽-> SCROLL_STATE_DRAGGING
* 快速滚动-> SCROLL_STATE_SETTLING
* 空闲状态-> SCROLL_STATE_IDLE
*
* @param state 滑动状态
*/
@Override
public void onScrollStateChanged(int state) {
if (mOnViewPagerListener != null) {
mOnViewPagerListener.onPageScrollStateChanged(state);
}
switch (state) {
case RecyclerView.SCROLL_STATE_IDLE:
View viewIdle = mPagerSnapHelper.findSnapView(this);
if (viewIdle != null) {
int positionIdle = getPosition(viewIdle);
boolean tag = viewIdle.getTag() != null && (boolean) viewIdle.getTag();
if (mOnViewPagerListener != null && getChildCount() == 1 && !tag) {
mOnViewPagerListener.onPageSelected(positionIdle, positionIdle == getItemCount() - 1);
viewIdle.setTag(true);
}
}
break;
case RecyclerView.SCROLL_STATE_DRAGGING:
break;
case RecyclerView.SCROLL_STATE_SETTLING:
break;
}
}
/**
* 布局完成后调用
*
* @param state state
*/
@Override
public void onLayoutCompleted(RecyclerView.State state) {
super.onLayoutCompleted(state);
}
/**
* 监听竖直方向的相对偏移量
*
* @param dy dy
* @param recycler recycler
* @param state 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 dx
* @param recycler recycler
* @param state 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 RecyclerView.OnChildAttachStateChangeListener mChildAttachStateChangeListener = new RecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
if (mOnViewPagerListener != null && getChildCount() == 1) {
int postion = getPosition(view);
mOnViewPagerListener.onPageSelected(postion, postion == getItemCount() - 1);
view.setTag(true);
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
boolean tag = view.getTag() != null && (boolean) view.getTag();
if (mOnViewPagerListener != null && tag) {
mOnViewPagerListener.onPageRelease(mDrift >= 0, getPosition(view));
view.setTag(false);
}
}
};
}
在滚动到下一个视频时,onLayoutComplete()会多次调用,导致多次调用playVideo(int)。