PullToRefreshListView中嵌套ViewPager滑动冲突的解决

最近恰好遇到PullToRefreshListView中需要嵌套ViewPager的情况,ViewPager 作为头部添加到ListView中,发先ViewPager在滑动过程中流畅性太差几乎很难左右滑动。在网上也看了很多大神的介绍,看了ViewPager的源码。其实思路很简单,只不过没有看到有教完整的说明,为了帮转像我这样的green hand 少走弯路,将过程整理下。大神自动略过~_~:

滑动冲突的解决大概要处理的问题无非是事件分发,事件拦截,和事件的处理,关于这部分内容大家可以在网上查看相关的资料,基本原理比较容易理解。有了这部分内容做铺垫。下面正式进入正题。

解决这个问题有两种实现方式

一 首先采取了给ViewPager设置监听的方式

vPager.setOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageSelected(int arg0) {//该方法是ViewPager滑动结束后,页面别选定后调用此方法/*在ViewPager滑动结束后需要通知父容器(ListView)可以* 对后续的事件进行适当的处理了(包括自身事件的拦截)*/lsv.requestDisallowInterceptTouchEvent(false);}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {//该方法是ViewPager滑动时调用此方法/*在ViewPager滑动时需要通知父容器(ListView)不要拦截,也就是说此事件交给ViewPager处理*/lsv.requestDisallowInterceptTouchEvent(true);   }@Overridepublic 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);}@Overridepublic 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);}
}

转载于:https://www.cnblogs.com/zhujiabin/p/7326553.html

PullToRefreshListView中嵌套ViewPager滑动冲突的解决相关推荐

  1. Android ViewPager嵌套ViewPager滑动冲突处理方法

    dispatchTouchEvent方法用于事件的分发,Android中所有的事件都必须经过这个方法的分发, 然后决定是自身消费当前事件还是继续往下分发给子控件处理.返回true表示不继续分发,事件没 ...

  2. ViewPager嵌套ViewPager 滑动冲突

    我在网上找了许多解决方法.但都不是很完美. 当进入子viewpager确实解决了子viewpager的滑动,但是父viewpager就失效了.现在奉上修改过的代码给大家. //别忘了布局引用也要变 / ...

  3. android中view手势滑动冲突的两种解决方法

    android中view手势滑动冲突的解决方法,主要解决方法有两种,外部和内部拦截.有需要的可以参考下. Android手势事件的冲突跟点击事件的分发过程息息相关,由三个重要的方法来共同完成,分别是: ...

  4. Android 系统(218)---Android的事件分发机制以及滑动冲突的解决

    Android的事件分发机制以及滑动冲突的解决 声明:  本文主要涉及VIew的事件分发与滑动冲突的解决,关于View的事件分发流程的部分内容参考自:  Android事件分发机制详解:史上最全面.最 ...

  5. 关于Android滑动冲突的解决方法(二)

    之前的一遍学习笔记主要就Android滑动冲突中,在不同方向的滑动所造成冲突进行了了解,这种冲突很容易理解,当然也很容易解决.今天,就同方向的滑动所造成的冲突进行一下了解,这里就先以垂直方向的滑动冲突 ...

  6. fragment中嵌套viewpager,vierpager中有多个fragment,不显示 .

    fragment中嵌套viewpager,vierpager中有多个fragment,不显示 ... 现在好多应用流行一种布局.底部几个工具栏选项,上面也有类似tab的选项. 底部用RadioGrou ...

  7. pb自定义控件 事件_Android WebView与下拉刷新控件滑动冲突的解决方法

    使用WebView时一般会在外层使用下拉刷新控件如(SwipeRefreshLayout).但是测试时会发现网页无法上拉,往上滑动就会触发下拉刷新控件的refresh事件.所以这里记录一下解决该问题的 ...

  8. scrollview中嵌套listview产生冲突问题

    在scrollview中嵌套listview或者gridview时 如果listview或者gridview的高度时wrap-content会导致两者只显示一行多一点 原因: listview和gri ...

  9. 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题

    . 参考界面 : 携程app首页的广告栏, 使用ViewPager实现        自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...

最新文章

  1. geany怎么创建文件夹_教程详情|Geany怎么使用,Geany安装使用教程_234游戏网
  2. 016. Remove me test
  3. 《Python地理数据处理》——导读
  4. PAT甲题题解-1128. N Queens Puzzle (20)-做了一个假的n皇后问题
  5. 高级程序员如何面对职场压力?(2)--受伤的总是我
  6. 使用powershell 执行脚本,windows默认不允许任何脚本运行
  7. PHP案例:实现数据库增删改查功能
  8. Javascript:ES6语法简述
  9. matlab 电力系统分析 毕设,基于Labview的“电力系统分析”课程仿真:电力系统分析matlab仿真实例...
  10. W5500以太网控制器芯片(一):ioLibrary库实现TCP服务器
  11. 逆向分析-QQ游戏连连看
  12. 12.分布式定时任务(xxl-job)
  13. DL/T645-2007通信协议应用层学习记录
  14. 服务器租用多少钱一年呢?
  15. 三层交换(VLAN间通信)
  16. 然后查看服务器运行情况,netstat命令查看服务器运行情况
  17. 这台笔记本最适合程序员编程!送!
  18. 恢复我的文档中三个标准文件夹
  19. Jetpack学习-5-Navigation简单使用
  20. SEO知识(总结土著游民)(1)

热门文章

  1. 小米手机升级Android6,小米3能升级miui 6?小米3升级miui v6教程
  2. 华为鸿蒙手机beta版,鸿蒙2.0 Beta手机版来了!明年将全面支持华为手机
  3. leetcode怎么用时间刷_刷完700多题后的首次总结:LeetCode应该怎么刷?
  4. HarmonyOS硬件创新合作伙伴,【HarmonyOS】HarmonyOS智能硬件开发学习指南 - HDC2020
  5. MS_DOS头部 IMAGE_DOS_HEADER
  6. 和可被 K 整除的子数组
  7. 将gcc/g++链接到指定版本
  8. 操作系统上机题目(多进程1)
  9. Ubuntu如何安装setuptools
  10. leetcode 202. 快乐数 思考分析(哈希集合与双指针解)