最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android中RecycleView與ViewPager沖突的解決方法及原理

 更新時(shí)間:2018年07月03日 15:39:50   作者:chun_soft  
這篇文章主要給大家介紹了關(guān)于Android中RecycleView與ViewPager沖突的解決方法及原理的相關(guān)資料,以及ViewPager嵌套R(shí)ecycleView卡頓問(wèn)題的處理方法,文中通過(guò)示例代碼介紹的非常狎昵,需要的朋友可以參考下

1.概述

在實(shí)際開(kāi)發(fā)中,我們經(jīng)常遇到需要在ListView或RecycleView頭部添加ViewPager實(shí)現(xiàn)Banner輪播效果,并需要添加下拉刷新,上拉加載功能。

但,橫向滑動(dòng)ViewPager時(shí),稍微偏移就會(huì)失去焦點(diǎn)。

2.解決方案

我們知道事件攔截的順序,父ViewGroup先接收到攔截,再傳遞給子ViewGroup 或子View。事件的處理順序是,子ViewGroup 或子View先處理,若子ViewGroup處理了,父ViewGroup就不用處理,若子ViewGroup未處理,則傳給父ViewGroup處理。

根據(jù)事件攔截原理,ViewPager和RecycleView相互沖突,RecycleView相當(dāng)于父ViewGroup,ViewPager相當(dāng)于子View,ViewPager和RecycleView相互沖突,將父View傳到ViewPager里面處理,重寫(xiě)View Pager。使用父類(lèi)方法requestDisallowInterceptTouchEvent(true) ,用來(lái)子View告訴父容器不要攔截我們的事件的。

(1)重寫(xiě)ViewPager

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

/**
 * Developer:chunsoft on 2016/10/31 16:04
 * Email:chun_soft@qq.com
 * Content:viewPager和RecycleView相互沖突,將父View傳到ViewPager里面
 * 使用父類(lèi)方法requestDisallowInterceptTouchEvent(true)
 * 用來(lái)子View告訴父容器不要攔截我們的事件的
 */

public class DecoratorViewPager extends ViewPager{
 private ViewGroup parent;
 public DecoratorViewPager(Context context) {
 super(context);
 }

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

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


 @Override
 public boolean dispatchTouchEvent(MotionEvent ev) {
 if (parent != null){
  parent.requestDisallowInterceptTouchEvent(true);
 }
 return super.dispatchTouchEvent(ev);
 }

 @Override
 public boolean onInterceptTouchEvent(MotionEvent ev) {
 if (parent != null){
  parent.requestDisallowInterceptTouchEvent(true);
 }
 return super.onInterceptTouchEvent(ev);
 }

 @Override
 public boolean onTouchEvent(MotionEvent ev) {
 if (parent != null){
  parent.requestDisallowInterceptTouchEvent(true);
 }
 return super.onTouchEvent(ev);
 }
}

(2)在Activity中:

DecoratorViewPager mPager = (DecoratorViewPager) mHeaderView.findViewById(R.id.viewpager);

 mPager.setNestedpParent((ViewGroup) mPager.getParent());

(3)在布局文件中:

<com.chunsoft.baseframework.utils.view.DecoratorViewPager
 android:id="@+id/viewpager"
 android:layout_width="match_parent"
 android:layout_height="180dp" />

處理ViewPager嵌套R(shí)ecycleView卡頓問(wèn)題

ViewPager里面添加了三個(gè)Fragment,F(xiàn)ragment里面添加了RecycleView,發(fā)現(xiàn)ViewPager左右滑動(dòng)切換非常不流暢,存在滑動(dòng)沖突,使用外部攔截進(jìn)行處理 so easy~~~

/**
* Created by magic on 2017/6/12 0012.外部攔截處理ViewPager嵌套R(shí)ecycleView左右滑動(dòng)切換Fragment卡頓問(wèn)題
*/

public class MyViewPager extends ViewPager {

float x, y;

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

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

@Override
public boolean onInterceptHoverEvent(MotionEvent event) {

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x = event.getX();
y = event.getY();
return super.onInterceptHoverEvent(event);
case MotionEvent.ACTION_MOVE:
if (Math.abs(x - event.getX()) > Math.abs(y - event.getY()))
return true;
else return false;
case MotionEvent.ACTION_UP:
return super.onInterceptHoverEvent(event);
}
return super.onInterceptHoverEvent(event);
}
}

注意:ACTION_DOWN和ACTION_UP中不要直接返回false 而要返回super.onInterceptHoverEvent(event) ,因?yàn)閂iewGroup中對(duì)事件攔截方法做了些基本處理。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Android使用JobScheduler定期推送本地通知實(shí)例代碼

    Android使用JobScheduler定期推送本地通知實(shí)例代碼

    本篇文章主要介紹了Android使用JobScheduler定期推送本地通知實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android:“萬(wàn)能”Activity重構(gòu)篇

    Android:“萬(wàn)能”Activity重構(gòu)篇

    本文主要介紹了mvp以及每一層,以及使用mvp來(lái)重構(gòu)“萬(wàn)能”Activity,其實(shí)每一層需要注意的東西還有很多,比如model層是最難寫(xiě)的一層。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • flutter實(shí)現(xiàn)頭部tabTop滾動(dòng)欄

    flutter實(shí)現(xiàn)頭部tabTop滾動(dòng)欄

    這篇文章主要為大家詳細(xì)介紹了flutter實(shí)現(xiàn)頭部tabTop滾動(dòng)欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Android單例模式的幾種方法總結(jié)

    Android單例模式的幾種方法總結(jié)

    這篇文章主要介紹了 Android單例模式的幾種方法總結(jié)的相關(guān)資料,這里有簡(jiǎn)單模式,復(fù)雜模式,線程鎖式及雙層鎖式的方法整理,需要的朋友可以參考下
    2017-07-07
  • 在Android中通過(guò)Intent使用Bundle傳遞對(duì)象的使用方法

    在Android中通過(guò)Intent使用Bundle傳遞對(duì)象的使用方法

    這篇文章主要介紹了在Android中通過(guò)Intent使用Bundle傳遞對(duì)象的使用方法,詳細(xì)介紹Intent使用Bundle傳遞對(duì)象的方法。有需要的可以了解一下。
    2016-11-11
  • Android調(diào)試神器stetho使用詳解和改造

    Android調(diào)試神器stetho使用詳解和改造

    今天小編就為大家分享一篇關(guān)于Android調(diào)試神器stetho使用詳解和改造,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • Android支付寶支付設(shè)計(jì)開(kāi)發(fā)

    Android支付寶支付設(shè)計(jì)開(kāi)發(fā)

    這篇文章主要為大家詳細(xì)介紹了Android支付寶支付設(shè)計(jì)開(kāi)發(fā),設(shè)計(jì)支付寶支付開(kāi)發(fā)方案,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Android自定義ViewPager指示器

    Android自定義ViewPager指示器

    這篇文章主要為大家詳細(xì)介紹了Android自定義ViewPager指示器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • ListView的Adapter使用 之 初學(xué)ArrayAdapter String

    ListView的Adapter使用 之 初學(xué)ArrayAdapter String

    ListView是Android中經(jīng)常會(huì)使用的東西,綁定數(shù)據(jù)對(duì)于初學(xué)者來(lái)說(shuō),尤其是剛接觸編程的人來(lái)說(shuō),往往會(huì)覺(jué)得很難理解,我上大二的時(shí)候?qū)W的java,但是基本上相當(dāng)于沒(méi)有學(xué),什么都沒(méi)寫(xiě)過(guò),真正接觸編程就是開(kāi)始上手學(xué)android,把這些記錄下來(lái),自己可以回頭看下,也可以讓新手更好的理解
    2013-06-06
  • 詳解Android中Dialog的使用

    詳解Android中Dialog的使用

    在Android中經(jīng)常要使用Dialog來(lái)實(shí)現(xiàn)一些提示以及一些特殊的效果,這里總結(jié)一些常用的Dialog的實(shí)踐,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2017-01-01

最新評(píng)論

墨脱县| 伊春市| 那坡县| 巴塘县| 逊克县| 阜新| 西华县| 阿克苏市| 武隆县| 鄂伦春自治旗| 历史| 泰来县| 雷州市| 皮山县| 抚松县| 高碑店市| 沅陵县| 张掖市| 海林市| 藁城市| 平果县| 嘉黎县| 柯坪县| 桃江县| 阿图什市| 石棉县| 巫溪县| 兴宁市| 灌阳县| 兴业县| 太和县| 岱山县| 丰县| 通化市| 望都县| 乌鲁木齐县| 长春市| 乳源| 永胜县| 长沙市| 阿鲁科尔沁旗|