Android中RecycleView與ViewPager沖突的解決方法及原理
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。使用父類方法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里面 * 使用父類方法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ì)腳本之家的支持。
- Android ExpandableListView實(shí)現(xiàn)下拉刷新和加載更多效果
- Android實(shí)踐之帶加載效果的下拉刷新上拉加載更多
- android使用PullToRefresh框架實(shí)現(xiàn)ListView下拉刷新上拉加載更多
- Android中使用ScrollView實(shí)現(xiàn)滑動(dòng)到底部顯示加載更多
- Android RecyclerView添加上拉加載更多效果
- Android RecycleView使用(CheckBox全選、反選、單選)
- android中RecycleView添加下滑到底部的監(jiān)聽(tīng)示例
- Android 使用RecycleView列表實(shí)現(xiàn)加載更多的示例代碼
相關(guān)文章
Android實(shí)現(xiàn)圖片預(yù)覽與保存功能
在App開(kāi)發(fā)中,通常為了省流提高加載速度提升用戶體驗(yàn)我們通常在列表中或新聞中的插圖都是以縮略圖壓縮過(guò)的圖片來(lái)進(jìn)行展示,當(dāng)用戶點(diǎn)擊圖片時(shí)我們?cè)偃ゼ虞d真正像素的大圖讓用戶預(yù)覽。本文將利用Flutter實(shí)現(xiàn)這一功能,需要的可以參考一下2022-04-04Android Studio配置反混淆的實(shí)現(xiàn)
這篇文章主要介紹了Android Studio如何混淆的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10android使用ItemDecoration給RecyclerView 添加水印
本篇文章主要介紹了android使用ItemDecoration給RecyclerView 添加水印,介紹了自定義Drawable來(lái)完成水印圖片和使用ItemDecoration來(lái)布局水印,有興趣的可以了解一下。2017-02-02Android中Bitmap常見(jiàn)的一些操作:縮放、裁剪、旋轉(zhuǎn)和偏移
Bitmap是Android中處理圖片的一個(gè)重要的類,下面這篇文章主要給大家介紹了關(guān)于Android中Bitmap常見(jiàn)的一些操作:縮放、裁剪、旋轉(zhuǎn)和偏移的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-07-07Android 拍照選擇圖片并上傳功能的實(shí)現(xiàn)思路(包含權(quán)限動(dòng)態(tài)獲取)
這篇文章主要介紹了Android 拍照(選擇圖片)并上傳(包含權(quán)限動(dòng)態(tài)獲取),本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12解析Android開(kāi)發(fā)優(yōu)化之:從代碼角度進(jìn)行優(yōu)化的技巧
下面我們就從幾個(gè)方面來(lái)了解Android開(kāi)發(fā)過(guò)程中的代碼優(yōu)化,需要的朋友參考下2013-05-05Android NDK開(kāi)發(fā)(C語(yǔ)言-文件讀寫(xiě))
這篇文章主要介紹了Android NDK開(kāi)發(fā)C語(yǔ)言文件讀寫(xiě),一個(gè)文件,無(wú)論它是文本文件還是二進(jìn)制文件,都是代表了一系列的字節(jié)。下面我們就來(lái)看看在Android NDK開(kāi)發(fā)中的C語(yǔ)言文件讀寫(xiě)詳細(xì)內(nèi)容吧,需要的朋友可以參考一下2021-12-12淺談關(guān)于Android WebView上傳文件的解決方案
這篇文章主要介紹了淺談關(guān)于Android WebView上傳文件的解決方案 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09基于Android 錯(cuò)誤信息捕獲發(fā)送至服務(wù)器的詳解
本篇文章是對(duì)Android中錯(cuò)誤信息捕獲發(fā)送服務(wù)器進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06