`
wb284551926
  • 浏览: 537856 次
文章分类
社区版块
存档分类
最新评论

Android listview viewpager解决冲突 滑动(转载)

 
阅读更多

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

 

 

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

如:

 

 

 

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

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

 

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

 

(1)解决方案

1. 针对viewpager 做了些修改  

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

 

 

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

 

 

2 . 在xml里面:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  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.   
  7.     <com.example.bz_viewpager.DecoratorViewPager  
  8.         android:id="@+id/vp"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="200dp"  
  11.         android:fadingEdge="none" />  
  12.   
  13. </RelativeLayout>  



 

3. 在代码里使用

 

将 viewpager 的父view传递到viewpager里面  

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

如下:

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. lv = (ListView) findViewById(R.id.lv);  
  2.   
  3. View header = LayoutInflater.from(MainActivity.this).inflate(R.layout.viewpage_layout, null);  
  4. DecoratorViewPager vp = (DecoratorViewPager) header.findViewById(R.id.vp);  
  5. vp.setNestedpParent((ViewGroup)vp.getParent());  
  6.   
  7. MyPagapter myPagapter = new MyPagapter(MainActivity.this);  
  8. vp.setAdapter(myPagapter);  
  9. lv.addHeaderView(header);  



 

(2)解析:

viewgroup 当中有 一个 requestDisallowInterceptTouchEvent方法

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

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

 

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  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);  


贴上源码:

 

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {  
  2.   
  3.     if (disallowIntercept == ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0)) {  
  4.         // We're already in this state, assume our ancestors are too  
  5.         return;  
  6.     }  
  7.   
  8.     if (disallowIntercept) {  
  9.         mGroupFlags |= FLAG_DISALLOW_INTERCEPT;  
  10.     } else {  
  11.         mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;  
  12.     }  
  13.   
  14.     // Pass it up to our parent  
  15.     if (mParent != null) {  
  16.         mParent.requestDisallowInterceptTouchEvent(disallowIntercept);  
  17.     }  
  18. }  



Demo 下载地址:

http://download.csdn.net/detail/aaawqqq/8447693

 

祝福大家每日精进

谢谢

原文地址:http://blog.csdn.net/aaawqqq/article/details/43824631

分享到:
评论

相关推荐

    Android listview和viewpager解决冲突 滑动冲突

    Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 blog 地址 : http://blog.csdn.net/aaawqqq/article/details/43824631

    自定义ViewPager,完美解决ListView和ScrollView事件冲突

    自定义的ViewPager,可以实现页面之前的相互切换,可以...同时该ViewPager解决了传统ViewPager和ListView,ScrollView滑动冲突问题,当然ListView的滑动冲突实在ScrollView中解决的。实践表明,滑动切换效果较好。

    Android三层滑动控件显示冲突和ViewPager高度动态调整的解决方案Demo

    ListView + ViewPager + Fragment + ListView 三层嵌套滑动控件的显示冲突解决方案,并且动态更新ViewPager的高度适应当前高度而不会出现大片空白

    Android App中ViewPager所带来的滑动冲突问题解决方法

    叙述 滑动冲突可以说是日常开发中比较常见的一类问题,也是比较让人头疼的一类问题,尤其是在使用第三...现在大部分应用最外层都是ViewPager+Fragment 的底部切换(比如微信)结构,这种时候,就很容易出现滑动冲突。不

    浅谈Android实践之ScrollView中滑动冲突处理解决方案

    涉及到了ViewPager,MapView,ListView,就需要ScrollView来做一下支援,这篇文章主要介绍了浅谈Android实践之ScrollView中滑动冲突处理解决方案,有需要的可以来了解一下。

    ViewPager嵌套ListView焦点冲突解决demo

    项目中碰到在ViewPager中嵌套ListView,然后ViewPager的滑动就不是很灵敏,出现了焦点冲突,做了这个demo,供大家解决这个问题,md网上各种没答案的,我想了好久,还询问了大神,总算搞出来了。

    天天动听源码,ViewPager套ViewPage,+ListView,ListView套GridView,再套SrcollView

    这两天心情不错手头没啥工作听听歌逛逛论坛在心中...ViewPager滑动解决之, ListView和GridView冲突解决之。。。。 当然这个界面还有另个思路就是 直接把ViewPager 轮播的贴到ListView的Header上,那位有时间就写下呗。

    android 仿淘宝京东 详情页可嵌套viewpager和listview

    android 仿淘宝京东 详情页 上下滑动的部分 下界面可以嵌套listview和viewpager 不会冲突

    ListView水平滑动分页

    ListView水平滑动分页,更改属性也可垂直滑动分页,但滑动事件有所冲突

    Android编程实现ListView头部ViewPager广告轮询图效果

    1、为了解决ListView头部加ViewPager滑动冲突问题,必须自定义ListView,重写里面的onInterceptTouchEvent方法,ListView代码如下: package com.example.testa; import android.content.Context; import a

    Android解决View的滑动冲突的方法

    关于 Android 的 TouchEvent 事件分发机制可以看这里:Java_Android_Learn ,本文讲解的是如何去解决 View 之间的滑动冲突 当父容器与子 View 都可以滑动时,就会产生滑动冲突。例如 ViewPager 中包含了 ListView 时...

    Android中RecycleView与ViewPager冲突的解决方法及原理

    在实际开发中,我们经常遇到需要在ListView或RecycleView头部添加ViewPager实现Banner轮播效果,并需要添加下拉刷新,上拉加载功能。 但,横向滑动ViewPager时,稍微偏移就会失去焦点。 2.解决方案 我们知道事件...

    Android-StickyNavLayoutAndroid源代码

    ListView 与ViewPager 滑动冲突处理,滑动到顶部固定位置停顿

    Android滑动冲突的完美解决

    Android滑动在智能手机上是必备的操作,但是在开发的时候,你是否和我一样,经常会遇到滑动冲突的问题,比如最简单需要在ListView里面添加一个侧滑动作,这时候冲突时必然的,那我们该如何解决这个问题呢?...

    Android滑动事件冲突的解决方法

    又比如一个ViewPager嵌套Fragment,Fragment里面又有ListView,这原本是有滑动冲突的,但是ViewPager内部去帮我们解决了这种冲突。那如果我们要自己解决冲突又该怎么办呢。 下面有两种方式来解决: 外部拦截法 外部...

    浅谈Android View滑动冲突的解决方法

    本来这种情况是存在滑动冲突的,只是ViewPager内部处理了这种滑动冲突。如果我们不使用ViewPager而是使用ScrollView,那么滑动冲突就需要我们自己来处理,否者造成的后果就是内外两层只有一层能滑动。 情况1的解决...

    Android嵌套滑动冲突的解决方法

    比如你有个activity,activity的上半部分是一个布局,下半部分是一个可滑动控件(RecyclerView、ListView等),或者下半部分是个viewpager,里面的fragment布局是一个可滑动控件,这样的页面就会产生滑动冲突。...

    Android滑动冲突问题的解决方法

    叙述 滑动冲突可以说是日常开发中比较常见的一类问题,也是比较让人头疼的一类问题,尤其是在使用第三...现在大部分应用最外层都是ViewPager+Fragment 的底部切换(比如微信)结构,这种时候,就很容易出现滑动冲突。

    Slidingmenu

    实现左右侧滑,解决ViewPager与ListView滑动冲突,在Adapter中嵌入EditText更改数据源

Global site tag (gtag.js) - Google Analytics