用PagerSnapHelper+RecyclerView模仿ViewPager行為慕淡,比ViewPager更加流暢

用法很簡單,只需要new一個PagerSnapHelper對象attachRecyclerView對象上沸毁,就能實現(xiàn)了Viewpager的粘性滑動,以下代碼呢是我在網(wǎng)上搜的一個模仿抖音滑動并且需要播放視頻特意封裝的一個類峰髓,使用這個布局管理器直接就能實現(xiàn)和ViewPager類似的布局,但是還是需要動態(tài)的去設(shè)置他的寬度(通常情況下是屏幕的寬度息尺,根據(jù)需求計算)携兵,里面包含的當前itemposition的獲取以及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);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末并级,一起剝皮案震驚了整個濱河市拂檩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘲碧,老刑警劉巖稻励,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異愈涩,居然都是意外死亡望抽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門履婉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煤篙,“玉大人,你說我怎么就攤上這事谐鼎〗Ⅲ。” “怎么了趣惠?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵狸棍,是天一觀的道長。 經(jīng)常有香客問我味悄,道長草戈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任侍瑟,我火速辦了婚禮唐片,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涨颜。我一直安慰自己费韭,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布庭瑰。 她就那樣靜靜地躺著星持,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弹灭。 梳的紋絲不亂的頭發(fā)上督暂,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音穷吮,去河邊找鬼逻翁。 笑死,一個胖子當著我的面吹牛捡鱼,可吹牛的內(nèi)容都是我干的八回。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缠诅!你這毒婦竟也來了伟墙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤滴铅,失蹤者是張志新(化名)和其女友劉穎戳葵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汉匙,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡拱烁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了噩翠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戏自。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖伤锚,靈堂內(nèi)的尸體忽然破棺而出擅笔,到底是詐尸還是另有隱情,我是刑警寧澤屯援,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布猛们,位于F島的核電站,受9級特大地震影響狞洋,放射性物質(zhì)發(fā)生泄漏弯淘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一吉懊、第九天 我趴在偏房一處隱蔽的房頂上張望庐橙。 院中可真熱鬧借嗽,春花似錦态鳖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缤沦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缸废,已是汗流浹背驶社。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工测萎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硅瞧。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像腕唧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子枣接,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容