Android listview viewpager解决冲突 滑动
Android listview viewpager 滑动 跳动 冲突解决
ListView中嵌套ViewPage有或者滑动手势冲突解决
在listview 上使用 addHeaderView 在第一栏添加 viewpager 当做header
如:
当触发 滑动事件 的时候容易引起 滑动冲突 (比如斜着滑动viewpager 的时候 listview会跳动)
特别是在 下拉刷新或者上拉加载 的时候 , 组件可能会传递到viewpager当中
查阅了很多的帖子 发现修改起来都非常麻烦
(1)解决方案
1. 针对viewpager 做了些修改
替换掉support.v4当中的viewpager即可:
package com.example.bz_viewpager; import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.ViewGroup; /** * viewpage 和listview 相互冲突 将父view 传递到viewpage 里面 * * 使用父类的方法 parent.requestDisallowInterceptTouchEvent(true); * * 当 requestDisallowInterceptTouchEvent 如果为true的时候 表示:父view 不拦截子view的touch 事件 * * 这个方法只是改变flag * * @author baozi * */ public class DecoratorViewPager extends ViewPager { private ViewGroup parent; public DecoratorViewPager(Context context) { super(context); // TODO Auto-generated constructor stub } public DecoratorViewPager(Context context, AttributeSet attrs) { super(context, attrs); } public void setNestedpParent(ViewGroup parent) { this.parent = parent; } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (parent != null) { parent.requestDisallowInterceptTouchEvent(true); } return super.dispatchTouchEvent(ev); } @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { if (parent != null) { parent.requestDisallowInterceptTouchEvent(true); } return super.onInterceptTouchEvent(arg0); } @Override public boolean onTouchEvent(MotionEvent arg0) { if (parent != null) { parent.requestDisallowInterceptTouchEvent(true); } return super.onTouchEvent(arg0); } }
2 . 在xml里面:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#f1f1f1" > <com.example.bz_viewpager.DecoratorViewPager android:id="@+id/vp" android:layout_width="match_parent" android:layout_height="200dp" android:fadingEdge="none" /> </RelativeLayout>
3. 在代码里使用
将 viewpager 的父view传递到viewpager里面
调用: vp.setNestedpParent((ViewGroup)vp.getParent()); 方法
如下:
lv = (ListView) findViewById(R.id.lv); View header = LayoutInflater.from(MainActivity.this).inflate(R.layout.viewpage_layout, null); DecoratorViewPager vp = (DecoratorViewPager) header.findViewById(R.id.vp); vp.setNestedpParent((ViewGroup)vp.getParent()); MyPagapter myPagapter = new MyPagapter(MainActivity.this); vp.setAdapter(myPagapter); lv.addHeaderView(header);
(2)解析:
viewgroup 当中有 一个 requestDisallowInterceptTouchEvent方法
这个方法只改变flag 当 view.requestDisallowInterceptTouchEvent 参数为true的时候
view 不会拦截其子控件的 触摸事件
/** * Called when a child does not want this parent and its ancestors to * intercept touch events with * {@link ViewGroup#onInterceptTouchEvent(MotionEvent)}. * * <p>This parent should pass this call onto its parents. This parent must obey * this request for the duration of the touch (that is, only clear the flag * after this parent has received an up or a cancel.</p> * * @param disallowIntercept True if the child does not want the parent to * intercept touch events. */ public void requestDisallowInterceptTouchEvent(boolean disallowIntercept);
贴上源码:
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { if (disallowIntercept == ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0)) { // We're already in this state, assume our ancestors are too return; } if (disallowIntercept) { mGroupFlags |= FLAG_DISALLOW_INTERCEPT; } else { mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT; } // Pass it up to our parent if (mParent != null) { mParent.requestDisallowInterceptTouchEvent(disallowIntercept); } }
祝福大家每日精进
谢谢
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。