RecycleView和ViewPager冲突解决与原理
1.概述
在实际开发中,我们经常遇到需要在ListView或RecycleView头部添加ViewPager实现Banner轮播效果,并需要添加下拉刷新,上拉加载功能。
但,横向滑动ViewPager时,稍微偏移就会失去焦点。
2.解决方案
我们知道事件拦截的顺序,父ViewGroup先接收到拦截,再传递给子ViewGroup 或子View。事件的处理顺序是,子ViewGroup 或子View先处理,若子ViewGroup处理了,父ViewGroup就不用处理,若子ViewGroup未处理,则传给父ViewGroup处理。
根据事件拦截原理,ViewPager和RecycleView相互冲突,RecycleView相当于父ViewGroup,ViewPager相当于子View,ViewPager和RecycleView相互冲突,将父View传到ViewPager里面处理,重写View Pager。使用父类方法requestDisallowInterceptTouchEvent(true)
,用来子View告诉父容器不要拦截我们的事件的。
- (1)重写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)* 用来子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;}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {if (parent != null){parent.requestDisallowInterceptTouchEvent(true);}return super.dispatchTouchEvent(ev);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {if (parent != null){parent.requestDisallowInterceptTouchEvent(true);}return super.onInterceptTouchEvent(ev);}@Overridepublic 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" />
RecycleView和ViewPager冲突解决与原理相关推荐
- Android之解决ScrollView嵌套RecycleView导致滑动冲突或者显示不全的问题
1 问题 ScrollView嵌套RecycleView导致滑动冲突或者显示不全的问题 2 解决办法 1).ScrollView替换成普通布局,然后RecycleView用的BaseMultiItem ...
- Android滑动冲突解决方法
Android滑动冲突解决方法 滑动冲突 首先讲解一下什么是滑动冲突.当你需要在一个ScrollView中嵌套使用ListView或者RecyclerView的时候你会发现只有ScrollView能够 ...
- NestedScrollView、RecycleView、ViewPager 嵌套常见问题
在开发中我们经常会用到 NestedScrollView 和 RecycleView,一般情况下这两种布局是不需要进行嵌套的,很多情况下 RecycleView 就可以自行解决,但是毕竟是一般情况,因 ...
- RecyclerView横向滑动与ViewPager冲突问题
问题出现场景: TabLayout + ViewPager + Fragment,Fragment中包含一个横向滑动的RecyclerView,出现了左右滑动RecyclerView时会与ViewPa ...
- mysql 主从,主主,主主复制时的主键冲突解决
原理:slave 的i/o thread ,不断的去master抓取 bin_log, 写入到本地relay_log 然后sql thread不断的更新slave的数据 把主服务器所有的数据复制给从服 ...
- Java 8中HashMap冲突解决
Java 8中HashMap冲突解决 目录(?)[+] 在Java 8 之前,HashMap和其他基于map的类都是通过链地址法解决冲突,它们使用单向链表来存储相同索引值的元素.在最坏的情况下,这种方 ...
- 哈希表及哈希冲突解决办法
哈希表及哈希冲突解决办法 目录 什么是哈希表? 哈希表的数据结构 哈希冲突 哈希冲突解决办法 1. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直 ...
- SVN:冲突解决 合并别人的修改
在项目中,基本不可避免多个人同时参与一个项目,因此就可能会出现多个人同时修改一个文件的情况,就不可避免的会出现冲突.svn已经很聪明了,如果你和别人对于同一个文件的修改之间不存在重叠(比如你在文件最开 ...
- jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理
jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理 最近在看jquery源码分析的视频教学,希望将视频中学到的知识用博客记录下来,更希望对有同样对jquery源码有困惑 ...
最新文章
- androidstudio判断手指滑动方向_方向盘的黑科技有多“黑”
- 风控特征—关系网络特征工程入门实践
- 前端开发中的Error以及异常捕获
- 《元学习meta learning)》2020综述论文大全!
- java金字塔数字代码_Java基础代码实例 :在控制台中输出金字塔,这个金字塔是由左右对称的数字组成的。 | 学步园...
- npm package.json文件解读
- Java文件路径(getResource)
- UGUI 自动布局的重叠BUG
- matlab dpsk,2DPSK调制与解调matlab(最新整理)
- 用ASP.Net写一个发送ICQ信息的程序
- HDU 5281 Senior#39;s Gun 杀怪
- 将list中的数据类型都变成int类型
- 学习UVC协议需要的工具
- Oracle大幅裁员,甲骨文云计算业务在华遭遇“滑铁卢”?
- python初级练习
- FFMpeg 滤镜中英文对照
- Unity_AR制作_80
- java facade dao_nsg-DAO
- 产品经理考什么证书?考这个准没错
- 应用时间序列分析清华大学出版社电子版_数据分析模型9——预知未来的算法:时间序列分析...
热门文章
- 简单理解基于PCA的人脸识别
- HEIST攻击:从HTTPS加密数据中获取明文
- 二叉树的前序遍历,二叉树的中序遍历,二叉树的后序遍历,二叉树的层序遍历
- 安装cnpm淘宝NPM镜像
- 【Java】判断电话号码所属的运营商
- 【DB笔试面试682】在Oracle中,Undo段中区3种状态分别是什么(Undo表空间系列)?...
- vulnhub-The Planets: Mercury
- 小学计算机应用到英语课教案,信息技术与小学英语教学的整合
- 腾讯python招聘_2019年最新Python爬取腾讯招聘网信息代码解析
- Canoe logging block