Android 中解決ViewPager嵌套R(shí)ecyclerView滑動(dòng)沖突

思路

最近在項(xiàng)目中遇到這樣一個(gè)需求:某個(gè)頁面中有4個(gè)Fragment,使用的是viewpager實(shí)現(xiàn)的,在某個(gè)fragment中又有一個(gè)橫向滑動(dòng)的Recyclerview,當(dāng)時(shí)心想,這個(gè)需求也不難啊坠宴,咔咔一頓響需求實(shí)現(xiàn)了,結(jié)果發(fā)現(xiàn)橫向滑動(dòng)Recyclerview時(shí)直接觸發(fā)了外層ViewPager的滑動(dòng)绷旗,滑動(dòng)到下一個(gè)Fragment了喜鼓,直接懵逼了,劇情不是這樣的啊衔肢,然后一頓咔咔百度庄岖,發(fā)現(xiàn)還是有各種各樣的問題,沒辦法角骤,只能自己解決咯
代碼已經(jīng)上傳到github:project

步驟

1.自定view繼承RecyclerView 重寫dispatchTouchEvent
2.監(jiān)聽手指移動(dòng)方向 水平方向大于豎直方向 則禁止ViewPager的滑動(dòng) 否則開啟ViewPager的滑動(dòng)以上步驟就是整個(gè)功能的核心思想隅忿,也算是一個(gè)取巧吧!

核心代碼

重寫Recyclerview觸摸事件

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewParent;

import com.apkfuns.logutils.LogUtils;
import com.meetacg.widget.pager.NoScrollViewPager;

/**
 * @author ganhuanhui
 * 時(shí)間:2019/12/2 0002
 * 描述:
 */
public class HorizontalRecyclerView extends RecyclerView {

    private float x1;
    private float y1;
    private SwipeRefreshLayout mSwipeRefreshLayout;

    public HorizontalRecyclerView(Context context) {
        super(context);
    }

    public HorizontalRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public HorizontalRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        //解決recyclerView和viewPager的滑動(dòng)影響
        //當(dāng)滑動(dòng)recyclerView時(shí)邦尊,告知父控件不要攔截事件硼控,交給子view處理
        get(false);
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                //當(dāng)手指按下的時(shí)候
                x1 = event.getX();
                y1 = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                //當(dāng)手指移動(dòng)的時(shí)候
                float x2 = event.getX();
                float y2 = event.getY();
                float offsetX = Math.abs(x2 - x1);
                float offsetY = Math.abs(y2 - y1);
                if (offsetX >= offsetY) {
                    get(true);//手指左移
                } else {
                    get(false);
                }
                break;
            case MotionEvent.ACTION_UP:
                x1 = y1 = 0;
                get(false);
                break;
        }
        return super.dispatchTouchEvent(event);
    }

    private ViewParent mViewParent;

    //使用迭代 直至找到parent是NoScrollViewPager為止
    //效率有些低 偏low 莫見怪
    private void get(boolean isEnable) {
        if (mViewParent == null)
            mViewParent = getParent();
        else
            mViewParent = mViewParent.getParent();
        if (mViewParent instanceof NoScrollViewPager) {
            //true 禁止ViewPager滑動(dòng),自動(dòng)交給recyclerview去滑動(dòng)
            //false 交給ViewPager滑動(dòng)
            NoScrollViewPager viewPager = (NoScrollViewPager) mViewParent;
            viewPager.setNoScroll(isEnable);

        } else {
            get(isEnable);
        }
    }
}

//重寫ViewPager onTouchEvent onInterceptTouchEvent

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
 * @author ganhuanhui
 * 時(shí)間:2019/12/17 0017
 * 描述:可禁止滑動(dòng)的ViewPager
 */
public class NoScrollViewPager extends ViewPager {
    // 是否禁止 viewpager 左右滑動(dòng)
    private boolean noScroll = false;

    public void setNoScroll(boolean noScroll){
        this.noScroll = noScroll;
    }

    public NoScrollViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent arg0) {
        if (noScroll){
            return false;
        }else{
            return super.onTouchEvent(arg0);
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        if (noScroll){
            return false;
        }else{
            return super.onInterceptTouchEvent(arg0);
        }
    }

}

使用

把HorizontalRecyclerView當(dāng)做正常的Recyclerview使用即可
好了胳赌,大功告成,目前已經(jīng)用在項(xiàng)目中 暫無發(fā)現(xiàn)問題 如有發(fā)現(xiàn)問題的朋友 還請私聊告知

參考

Android禁止滑動(dòng)的NoScrollViewPager

Android 網(wǎng)格分頁布局

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匙隔,一起剝皮案震驚了整個(gè)濱河市疑苫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖捍掺,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撼短,死亡現(xiàn)場離奇詭異,居然都是意外死亡挺勿,警方通過查閱死者的電腦和手機(jī)曲横,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來不瓶,“玉大人禾嫉,你說我怎么就攤上這事∥秘ぃ” “怎么了熙参?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長麦备。 經(jīng)常有香客問我孽椰,道長,這世上最難降的妖魔是什么凛篙? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任黍匾,我火速辦了婚禮,結(jié)果婚禮上呛梆,老公的妹妹穿的比我還像新娘锐涯。我一直安慰自己,他們只是感情好削彬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布全庸。 她就那樣靜靜地躺著,像睡著了一般融痛。 火紅的嫁衣襯著肌膚如雪壶笼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天雁刷,我揣著相機(jī)與錄音覆劈,去河邊找鬼。 笑死沛励,一個(gè)胖子當(dāng)著我的面吹牛责语,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播目派,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坤候,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了企蹭?” 一聲冷哼從身側(cè)響起白筹,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤智末,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后徒河,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體系馆,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年顽照,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了由蘑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡代兵,死狀恐怖尼酿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奢人,我是刑警寧澤谓媒,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站何乎,受9級特大地震影響句惯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜支救,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一抢野、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧各墨,春花似錦指孤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至黎做,卻和暖如春叉跛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒸殿。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工筷厘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宏所。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓酥艳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親爬骤。 傳聞我的和親對象是個(gè)殘疾皇子充石,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355