DingMouRen / LayoutManagerGroup

:point_right: Customize the LayoutManager of RecyclerView(自定义LayoutManager)
4.98k stars 680 forks source link

ViewPagerLayoutManagerActivity的playVideo(int)多次调用问题 #13

Open TokenYc opened 6 years ago

TokenYc commented 6 years ago

在滚动到下一个视频时,onLayoutComplete()会多次调用,导致多次调用playVideo(int)。

DingMouRen commented 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

xiaohuijun commented 6 years ago

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);
        }
    }
};

}