Android listview viewpager滑动 跳动 冲突解决

ListView中嵌套ViewPage有或者滑动手势冲突解决

 

在listview 上使用 addHeaderView 在第一栏添加 viewpager 当做header

如:

当触发 滑动事件 的时候容易引起 滑动冲突    (比如斜着滑动viewpager  的时候 listview会跳动)

特别是在  下拉刷新或者上拉加载 的时候 , 组件可能会传递到viewpager当中

查阅了很多的帖子  发现修改起来都非常麻烦

(1)解决方案

1. 针对viewpager 做了些修改

替换掉support.v4当中的viewpager即可:

  1. package com.example.bz_viewpager;
  2. import android.content.Context;
  3. import android.support.v4.view.ViewPager;
  4. import android.util.AttributeSet;
  5. import android.view.MotionEvent;
  6. import android.view.ViewGroup;
  7. /**
  8. * viewpage 和listview 相互冲突 将父view 传递到viewpage 里面
  9. *
  10. * 使用父类的方法 parent.requestDisallowInterceptTouchEvent(true);
  11. *
  12. * 当 requestDisallowInterceptTouchEvent 如果为true的时候 表示:父view 不拦截子view的touch 事件
  13. *
  14. * 这个方法只是改变flag
  15. *
  16. * @author baozi
  17. *
  18. */
  19. public class DecoratorViewPager extends ViewPager {
  20. private ViewGroup parent;
  21. public DecoratorViewPager(Context context) {
  22. super(context);
  23. // TODO Auto-generated constructor stub
  24. }
  25. public DecoratorViewPager(Context context, AttributeSet attrs) {
  26. super(context, attrs);
  27. }
  28. public void setNestedpParent(ViewGroup parent) {
  29. this.parent = parent;
  30. }
  31. @Override
  32. public boolean dispatchTouchEvent(MotionEvent ev) {
  33. if (parent != null) {
  34. parent.requestDisallowInterceptTouchEvent(true);
  35. }
  36. return super.dispatchTouchEvent(ev);
  37. }
  38. @Override
  39. public boolean onInterceptTouchEvent(MotionEvent arg0) {
  40. if (parent != null) {
  41. parent.requestDisallowInterceptTouchEvent(true);
  42. }
  43. return super.onInterceptTouchEvent(arg0);
  44. }
  45. @Override
  46. public boolean onTouchEvent(MotionEvent arg0) {
  47. if (parent != null) {
  48. parent.requestDisallowInterceptTouchEvent(true);
  49. }
  50. return super.onTouchEvent(arg0);
  51. }
  52. }

2 . 在xml里面:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:background="#f1f1f1" >
  6. <com.example.bz_viewpager.DecoratorViewPager
  7. android:id="@+id/vp"
  8. android:layout_width="match_parent"
  9. android:layout_height="200dp"
  10. android:fadingEdge="none" />
  11. </RelativeLayout>

3. 在代码里使用

将 viewpager 的父view传递到viewpager里面

调用:       vp.setNestedpParent((ViewGroup)vp.getParent()); 方法

如下:

  1. lv = (ListView) findViewById(R.id.lv);
  2. View header = LayoutInflater.from(MainActivity.this).inflate(R.layout.viewpage_layout, null);
  3. DecoratorViewPager vp = (DecoratorViewPager) header.findViewById(R.id.vp);
  4. vp.setNestedpParent((ViewGroup)vp.getParent());
  5. MyPagapter myPagapter = new MyPagapter(MainActivity.this);
  6. vp.setAdapter(myPagapter);
  7. lv.addHeaderView(header);

(2)解析:

viewgroup 当中有 一个 requestDisallowInterceptTouchEvent方法

这个方法只改变flag  当 view.requestDisallowInterceptTouchEvent 参数为true的时候

view 不会拦截其子控件的 触摸事件

  1. /**
  2. * Called when a child does not want this parent and its ancestors to
  3. * intercept touch events with
  4. * {@link ViewGroup#onInterceptTouchEvent(MotionEvent)}.
  5. *
  6. * <p>This parent should pass this call onto its parents. This parent must obey
  7. * this request for the duration of the touch (that is, only clear the flag
  8. * after this parent has received an up or a cancel.</p>
  9. *
  10. * @param disallowIntercept True if the child does not want the parent to
  11. *            intercept touch events.
  12. */
  13. public void requestDisallowInterceptTouchEvent(boolean disallowIntercept);

贴上源码:

    1. public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    2. if (disallowIntercept == ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0)) {
    3. // We're already in this state, assume our ancestors are too
    4. return;
    5. }
    6. if (disallowIntercept) {
    7. mGroupFlags |= FLAG_DISALLOW_INTERCEPT;
    8. } else {
    9. mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;
    10. }
    11. // Pass it up to our parent
    12. if (mParent != null) {
    13. mParent.requestDisallowInterceptTouchEvent(disallowIntercept);
    14. }
    15. }

Android listview viewpager解决冲突 滑动的更多相关文章

  1. Android ListView焦点事件冲突问题与解决

    Android ListView对于单纯列表展示是很好用的,但是一旦牵扯到对listView进行操作就会遇到各种各样的问题.比如保存Checkbox状态与item复用的冲突.遇到可获取焦点的控件比如说 ...

  2. 114、Android禁止ViewPager的左右滑动

    有时候在开发中会遇到一些“诡异”的要求,比如在ViewPager中嵌入ListView,或者再嵌入一个ViewPager,那么在滑动的时候就会造成被嵌入的XXView不能滑动了,那么现在就把最外层的V ...

  3. Android禁止ViewPager的左右滑动

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/40744287 有时候在开发中会遇到一些"诡异"的要求,比方在V ...

  4. Android ListView 和 ScrollView 冲突问题

    近期做一款APP,当中有一个类似微博的评论功能的界面,先是列出微博的正文内容和图片等.然后下边是评论. 一開始就想着用一个ScrollView把主要内容和评论区的ListView包起来.然后加入各个控 ...

  5. [Android]ListView & ViewPager & GridView 常见问题解决方法

    1. ViewPager左右滚动到两边时的渐变色,若想禁止,可以在布局文件中配置:android:overScrollMode="never" 2. ListView,GridVi ...

  6. [Android]使用ViewPager实现图片滑动展示

    在淘宝等电商的APP首页经常能看到大幅的广告位,通常有多幅经常更新的图片用于展示促销信息,如下图所示: 通常会自动滚动,也可以根据手势滑动.我没有研究过人家的APP是通过什么实现的,可能有第三方已经封 ...

  7. 011 Android TabLayout+ViewPager实现顶部滑动效果(多个页面)

    1.TabLayout介绍 TabLayout提供了一个水平的布局用来展示Tabs,很多应用都有这样的设计,典型的有网易新闻,简书,知乎等.TabLayout就可以很好的完成这一职责,首先TabLay ...

  8. Android使用ViewFlipper实现左右滑动效果面

    在我的博客中,上次是使用ViewPager实现左右滑动的效果的,请看文章:Android使用ViewPager实现左右滑动效果. 这次我来使用ViewFlipper实现这种效果,好了,先看看效果吧: ...

  9. android 解决ListView点击与滑动事件冲突

    如果你的ListView的Item有滑动功能,但又点击Item跳转到其它activity,这样若是在Adapter里面写点击事件是会导致滑动事件获取不到焦点而失效: 解决方法:不要在adapter里面 ...

随机推荐

  1. JQuery实现回车代替Tab键(按回车跳到下一栏)

    一个提交按钮以后,用户如果按了键盘的回车键,默认情况下,就会提交这个表单了.这样对于用户输入各个表单项目,用户体验很不好,输入完一个项目,或者用鼠标选择下一个项目,或者用键盘的Tab键选中下一个项目. ...

  2. cat命令的作用

    1.显示文件内容,如more的功能. 使用方法: cat  filename. 注:cat,无论文件多长,一次性全部显示:more,一次只显示一个屏幕高度的内容. 2.创建文件,如touch功能. 使 ...

  3. (转)内网网站发布到外网-nat123动态公网IP动态域名解析

    环境描述: 路由器分配的是动态公网IP,且有路由器登录管理权限,网站服务器部署在路由器内部网络.如何将内网网站发布到外网大众访问? 解决方案: 内网使用nat123动态域名解析,将域名实时固定解析到路 ...

  4. Oracle基础 数据泵导出/导入Expdp/impdp(转)

    一.EXPDP和IMPDP使用说明 Oracle Database 10g引入了最新的数据泵(Data Dump)技术,数据泵导出导入(EXPDP和IMPDP)的作用 1)实现逻辑备份和逻辑恢复. 2 ...

  5. 关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法总结

    遇到此问题先需确认几个问题: 1)MS DTC是否设置正确? 2)是否启用了防火墙?是否对DTC做了例外? 3)是否做了hosts映射?是否跨网域通信? 开发分布式事务,碰到一个错误“与基础事务管理器 ...

  6. java执行程序

    执行jar java -jar x.jar 执行jar里边指定class java -cp x.jar x.x.x

  7. Android简易注解View(java反射实现)

    一.引言 Android中通过findViewById在布局文件中找到需要的View,加入一个Activity里面有许多的View需要初始化,那将是一件很繁琐的事情.当然Google一下你会发现有很多 ...

  8. Linux 网卡设备驱动程序设计(3)

    三.网络子系统深度分析 用户程序通过网络发送这个网络数据包 通过 SCI 协议无关接口 协议栈 <   UDP的实现  会选择路由 <    IP的实现  会建立这个邻居子系统,建立邻居信 ...

  9. Linux 内存管理子系统

    一.内存管理子系统 1 . 内存管理模块 功能: 虚拟地址到物理地址的映射 32位系统访问的地址一共4G: 0-3G : 应用程序 3G+896M :直接映射 , Vmollat区,永久内存映射,固定 ...

  10. vagrant WARNING: You are not using an encrypted connection

    开发环境:vagrant 1.7 + centos 6(i386) + LAMP Drupal版本:7.53 在vagrant LAMP开发环境中,给Druapl安装模块时,显示WARNING: Yo ...