帶下拉刷新的RecyclerView嵌套橫向RecyclerView事件沖突

實(shí)際效果圖

采用結(jié)構(gòu)

  • PtrFrameLayout 嵌套一個(gè)帶下拉刷新的RecyclerView
    PtrFrameLayout是一個(gè)自定義下拉刷新布局

  • RV內(nèi)部Item包含一個(gè)橫向滑動(dòng)的RecyclerView在頂部

導(dǎo)致的問題:橫向滑動(dòng)RecyclerView時(shí)經(jīng)常容易引起下拉刷新,這種體驗(yàn)很差


解決思路

  1. 繼承RecyclerView,重寫dispatchTouchEvent盏檐,根據(jù)ACTION_MOVE的方向判斷是否調(diào)用getParent().requestDisallowInterceptTouchEvent去阻止父view攔截點(diǎn)擊事件

  2. 通過繼承PtrFrameLayout翻默,重寫requestDisallowInterceptTouchEvent方法腰根,獲取disallowIntercept來判斷是否分發(fā)事件給父View(避免父View獲取事件引起下拉操作)

    @Override
    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        disallowInterceptTouchEvent = disallowIntercept;
        //子View告訴父容器不要攔截我們的事件的
        super.requestDisallowInterceptTouchEvent(disallowIntercept);
    }```

#### 具體源碼
* 重寫橫向滑動(dòng)RecyclerView

public class BetterRecyclerView extends RecyclerView {
private ViewGroup parent;

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

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

public void setNestParent(ViewGroup parent) {
    this.parent = parent;
}

private int lastX = -1;
private int lastY = -1;

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    int x = (int) ev.getRawX();
    int y = (int) ev.getRawY();
    int dealtX = 0;
    int dealtY = 0;

    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            dealtX = 0;
            dealtY = 0;
            // 保證子View能夠接收到Action_move事件
            getParent().requestDisallowInterceptTouchEvent(true);
            break;
        case MotionEvent.ACTION_MOVE:
            dealtX += Math.abs(x - lastX);
            dealtY += Math.abs(y - lastY);

// Log.i("dispatchTouchEvent", "dealtX:=" + dealtX);
// Log.i("dispatchTouchEvent", "dealtY:=" + dealtY);
// 這里是夠攔截的判斷依據(jù)是左右滑動(dòng)新翎,讀者可根據(jù)自己的邏輯進(jìn)行是否攔截
if (dealtX >= dealtY) {
getParent().requestDisallowInterceptTouchEvent(true);
} else {
getParent().requestDisallowInterceptTouchEvent(false);
}
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_CANCEL:
break;
case MotionEvent.ACTION_UP:
break;

    }
    return super.dispatchTouchEvent(ev);
}
* 重寫PtrFrameLayout的部分源碼

private boolean disallowInterceptTouchEvent = false;
@Override
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
disallowInterceptTouchEvent = disallowIntercept;

    super.requestDisallowInterceptTouchEvent(disallowIntercept);
}

@Override
public boolean dispatchTouchEvent(MotionEvent e) {
    switch (e.getAction()) {
        case MotionEvent.ACTION_UP:
            this.requestDisallowInterceptTouchEvent(false);
            disableWhenHorizontalMove(true);
            break;
    }
    if (disallowInterceptTouchEvent) {
        return dispatchTouchEventSupper(e);
    }
    return super.dispatchTouchEvent(e);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缓醋,一起剝皮案震驚了整個(gè)濱河市署鸡,隨后出現(xiàn)的幾起案子案糙,更是在濱河造成了極大的恐慌,老刑警劉巖靴庆,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件时捌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡炉抒,警方通過查閱死者的電腦和手機(jī)奢讨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焰薄,“玉大人拿诸,你說我怎么就攤上這事∪” “怎么了亩码?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凡桥。 經(jīng)常有香客問我蟀伸,道長(zhǎng),這世上最難降的妖魔是什么缅刽? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任啊掏,我火速辦了婚禮,結(jié)果婚禮上衰猛,老公的妹妹穿的比我還像新娘迟蜜。我一直安慰自己,他們只是感情好啡省,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布娜睛。 她就那樣靜靜地躺著髓霞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畦戒。 梳的紋絲不亂的頭發(fā)上方库,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音障斋,去河邊找鬼纵潦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛垃环,可吹牛的內(nèi)容都是我干的邀层。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼遂庄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼寥院!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涛目,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤秸谢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后泌绣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钮追,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年阿迈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了元媚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苗沧,死狀恐怖刊棕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情待逞,我是刑警寧澤甥角,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站识樱,受9級(jí)特大地震影響嗤无,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怜庸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一当犯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧割疾,春花似錦嚎卫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侵佃。三九已至,卻和暖如春奠支,著一層夾襖步出監(jiān)牢的瞬間馋辈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工胚宦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留首有,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓枢劝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親卜壕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子您旁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

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