用法很簡單,只需要new一個PagerSnapHelper對象attach到RecyclerView對象上沸毁,就能實現(xiàn)了Viewpager的粘性滑動,以下代碼呢是我在網(wǎng)上搜的一個模仿抖音滑動并且需要播放視頻特意封裝的一個類峰髓,使用這個布局管理器直接就能實現(xiàn)和ViewPager類似的布局,但是還是需要動態(tài)的去設(shè)置他的寬度(通常情況下是屏幕的寬度息尺,根據(jù)需求計算)携兵,里面包含的當前item的position的獲取以及item離開界面時候的銷毀監(jiān)聽,感覺很有用搂誉,特意貼出來給大家分享一下徐紧,類里面有大佬的github地址,博客地址我也是找不到了就沒做成鏈接
/**
* Created by 釘某人
* github: https://github.com/DingMouRen
* email: naildingmouren@gmail.com
* edit by yc
*/
public class ViewPagerLayoutManager extends LinearLayoutManager {
private static final String TAG = "ViewPagerLayoutManager";
private PagerSnapHelper mPagerSnapHelper;
private OnViewPagerListener mOnViewPagerListener;
private RecyclerView mRecyclerView;
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);
this.mRecyclerView = view;
mRecyclerView.addOnChildAttachStateChangeListener(mChildAttachStateChangeListener);
}
/**
* 滑動狀態(tài)的改變
* 緩慢拖拽-> SCROLL_STATE_DRAGGING
* 快速滾動-> SCROLL_STATE_SETTLING
* 空閑狀態(tài)-> SCROLL_STATE_IDLE
*
* @param state
*/
@Override
public void onScrollStateChanged(int state) {
switch (state) {
case RecyclerView.SCROLL_STATE_IDLE:
View viewIdle = mPagerSnapHelper.findSnapView(this);
if (viewIdle != null) {
int positionIdle = getPosition(viewIdle);
int childCount = getChildCount();
if (mOnViewPagerListener != null && getChildCount() <= 2) {
mOnViewPagerListener.onPageSelected(positionIdle, positionIdle == getItemCount() - 1);
}
}
break;
case RecyclerView.SCROLL_STATE_DRAGGING:
break;
case RecyclerView.SCROLL_STATE_SETTLING:
break;
default:
break;
}
}
/**
* 監(jiān)聽豎直方向的相對偏移量
*
* @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);
}
/**
* 監(jiān)聽水平方向的相對偏移量
*
* @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);
}
/**
* if return >= 0 snap is exist
* if return < 0 snap is not exist
*
* @return
*/
public int findSnapPosition() {
View viewIdle = mPagerSnapHelper.findSnapView(this);
if (viewIdle != null) {
return getPosition(viewIdle);
} else {
return -1;
}
}
/**
* 設(shè)置監(jiān)聽
*
* @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) {
mOnViewPagerListener.onInitComplete();
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
if (mOnViewPagerListener != null) {
if (mDrift >= 0) {
mOnViewPagerListener.onPageRelease(true, getPosition(view));
} else {
mOnViewPagerListener.onPageRelease(false, getPosition(view));
}
}
}
};
}
/**
* Created by 釘某人
* github: https://github.com/DingMouRen
* email: naildingmouren@gmail.com
* 用于ViewPagerLayoutManager的監(jiān)聽
*
* @author yc
*/
public interface OnViewPagerListener {
/**
* 初始化第一個View
*/
void onInitComplete();
/**
* 選中的監(jiān)聽以及判斷是否滑動到底部
*
* @param position
* @param isBottom
*/
void onPageSelected(int position, boolean isBottom);
/**
* 釋放的監(jiān)聽
*
* @param isNext
* @param position
*/
void onPageRelease(boolean isNext, int position);
}