PullToRefreshListView中嵌套ViewPager滑动冲突的解决
PullToRefreshListView中嵌套ViewPager滑动冲突的解决
最近恰好遇到PullToRefreshListView中需要嵌套ViewPager的情况,ViewPager 作为头部添加到ListView中,发先ViewPager在滑动过程中流畅性太差几乎很难左右滑动。在网上也看了很多大神的介绍,看了ViewPager的源码。其实思路很简单,只不过没有看到有教完整的说明,为了帮转像我这样的green hand 少走弯路,将过程整理下。大神自动略过~_~:
滑动冲突的解决大概要处理的问题无非是事件分发,事件拦截,和事件的处理,关于这部分内容大家可以在网上查看相关的资料,基本原理比较容易理解。有了这部分内容做铺垫。下面正式进入正题。
解决这个问题有两种实现方式
一 首先采取了给ViewPager设置监听的方式
vPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
//该方法是ViewPager滑动结束后,页面别选定后调用此方法
/*在ViewPager滑动结束后需要通知父容器(ListView)可以
* 对后续的事件进行适当的处理了(包括自身事件的拦截)*/
lsv.requestDisallowInterceptTouchEvent(false);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
//该方法是ViewPager滑动时调用此方法
/*在ViewPager滑动时需要通知父容器(ListView)不要拦截,
也就是说此事件交给ViewPager处理*/
lsv.requestDisallowInterceptTouchEvent(true);
}
@Override
public void onPageScrollStateChanged(int arg0) {
//该方法是ViewPager滑动状态发生变化时调用此方法
//这里暂时不要进行相关的操作。
}
});
这种方式可以解决ViewPager左右滑动与listView的冲突问题,但是会有一个问题,此时在VIewPager上的下拉事件也被ViewPager接收,只能在ViewPager下边下拉才能实现PullToRefreshListView 的下拉刷新效果。
如果不需要下拉刷新,普通的ListView 通过上面的方式完全可以达到预期的效果
二 重写ViewPager的disPatchTouchEvent方法
基本思路就是要重写ViewPager的disPatchTouchEvent方法,通过比较x、y轴的移动距离,决定事件是否自己进行处理。
package com.ccq.tuangou.myview; import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent; public class MyViewPager extends ViewPager {
float mDownX;
float mDownY;
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
//DOWN 事件的时候记录下当前的xy左标
mDownX=ev.getX();
mDownY=ev.getY();
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
/*MOVE 事件后计算x轴y轴的移动距离 ,如果x轴移动距离大于y轴,
那么该事件有ViewPager处理,否则交给父容器处理*/
if(Math.abs(ev.getX()-mDownX)>Math.abs(ev.getY()-mDownY)){
getParent().requestDisallowInterceptTouchEvent(true);
}else{
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_CANCEL:
getParent().requestDisallowInterceptTouchEvent(false);
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
}
PullToRefreshListView中嵌套ViewPager滑动冲突的解决的更多相关文章
- (转)ViewPager,ScrollView 嵌套ViewPager滑动冲突解决
ViewPager,ScrollView 嵌套ViewPager滑动冲突解决 本篇主要讲解一下几个问题 粗略地介绍一下View的事件分发机制 解决事件滑动冲突的思路及方法 ScrollView 里面嵌 ...
- 解决scrollView中嵌套viewPager的冲突问题
很简单,在外层ScrollView中添加android:fillViewport="true"属性,然后给viewPager添加一个固定高度
- Android ViewPager嵌套ViewPager滑动冲突处理方法
dispatchTouchEvent方法用于事件的分发,Android中所有的事件都必须经过这个方法的分发, 然后决定是自身消费当前事件还是继续往下分发给子控件处理.返回true表示不继续分发,事件没 ...
- 关于Android滑动冲突的解决方法(二)
之前的一遍学习笔记主要就Android滑动冲突中,在不同方向的滑动所造成冲突进行了了解,这样的冲突非常easy理解,当然也非常easy解决.今天,就同方向的滑动所造成的冲突进行一下了解,这里就先以垂直 ...
- fragment中嵌套viewpager,vierpager中有多个fragment,不显示 .
fragment中嵌套viewpager,vierpager中有多个fragment,不显示 ... 现在好多应用流行一种布局.底部几个工具栏选项,上面也有类似tab的选项. 底部用RadioGrou ...
- 扩展ViewFlow避免和ViewPager滑动冲突,同时支持无限循环,并完美和CircleFlowIndicator结合
首先,为了避免滑动冲突,我们要继承ViewFlow,重写onInterceptTouchEvent public class MyViewFlow extends ViewFlow { private ...
- Android ScrollView与ViewPager滑动冲突
前段时间做项目碰到在ScrollView里添加ViewPager,但是发现ViewPager的左右滑动和ScrollView的滑动冲突了,解决这个问题的方法是重写ScrollView. 代码: pub ...
- Android scrollview嵌套webview滑动冲突的解决方案
在Android开发中有时我们需要在scrollview中嵌套webview这时你会发现这两者的滑动事件产生了冲突导致:webview很难被滑动,即使被滑动了一点也非常不顺畅.解决方案也比较简单只需要 ...
- 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
. 参考界面 : 携程app首页的广告栏, 使用ViewPager实现 自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...
随机推荐
- 嵌入式(C)笔试题
1 读程序段,回答问题 (a) int main(int argc,char *argv[]) { int c=9,d=0; c=c++%5; d=c; printf("d=%d\n&quo ...
- Qt之QAbstractButton
简述 QAbstractButton类是按钮部件的抽象基类,提供了按钮所共有的功能. QAbstractButton类实现了一个抽象按钮,并且让它的子类来指定如何处理用户的动作,并指定如何绘制按钮. ...
- 【Codeforces】512C Fox and Dinner
[解析]欧拉筛法,奇偶分析.建二分图,网络流 [Analysis] http://blog.csdn.net/qq574857122/article/details/43453087. 所谓的连通块就 ...
- C++友元(Friend)简介
相对Java而言,友元是C++中特有的一种元素,再加上<C++ Primer>也并没有太具体的样例,所以刚接触这个概念的时候懵了非常久,即是自己总结一下,也希望能帮到大家,以下来讲讲友元的 ...
- cocos2d-x中的二段构造模式
学习cocos2d-x的过程中,会发现很多对象都通过一个静态函数create来创建.比方以下的一个样例 #define CREATE_FUNC (__TYPE__) \ static __TYPE__ ...
- Mysql常见更改密码方法
ERROR (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) ch ...
- Mvc 返回文件直接下载
今天碰到一个问题,前端点击下载文件,后端判断文件是否存在,不存在则自动生成文件(图片),返回前端会自动下载文件 网上查了一些 Mvc action中返回File类型 设置一些contentType ...
- array.fliter无法正确过滤出我想要的数组
var checked_list = state.files.filter(function(item, id){ // console.log('click the ' + item.id); re ...
- YYDispatchQueuePool阅读笔记
阅读了开源大神的YYDispatchQueuePool,在此记下一些从中学到的东西. 首先YYDispatchQueuePool.m文件中有如下类型对应: static inline dispatch ...
- hiho147周 - 数据结构 bitset
题目链接 n个5维数,对于每个数,输出小于他的数的个数(每个维度都比他小); #include <cstdio> #include <cstring> #include < ...