Android listview viewpager滑动 跳动 冲突解决
ListView中嵌套ViewPage有或者滑动手势冲突解决
在listview 上使用 addHeaderView 在第一栏添加 viewpager 当作header html
如:java

当触发 滑动事件 的时候容易引发 滑动冲突 (好比斜着滑动viewpager 的时候 listview会跳动)android
特别是在 下拉刷新或者上拉加载 的时候 , 组件可能会传递到viewpager当中ide
查阅了不少的帖子 发现修改起来都很是麻烦 this
(1)解决方案
1. 针对viewpager 作了些修改
替换掉support.v4当中的viewpager便可:spa
- 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;
-
- public class DecoratorViewPager extends ViewPager {
- private ViewGroup parent;
-
- public DecoratorViewPager(Context context) {
- super(context);
-
- }
-
- 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里面 .net
调用: vp.setNestedpParent((ViewGroup)vp.getParent()); 方法code
以下:xml
- 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方法htm
这个方法只改变flag 当 view.requestDisallowInterceptTouchEvent 参数为true的时候
view 不会拦截其子控件的 触摸事件
- public void requestDisallowInterceptTouchEvent(boolean disallowIntercept);
贴上源码:
- public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
-
- if (disallowIntercept == ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0)) {
-
- return;
- }
-
- if (disallowIntercept) {
- mGroupFlags |= FLAG_DISALLOW_INTERCEPT;
- } else {
- mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;
- }
-
-
- if (mParent != null) {
- mParent.requestDisallowInterceptTouchEvent(disallowIntercept);
- }
- }